# ex-skill: turning a WeChat or iMessage export into a two part persona Skill

> ex-skill installs as a slash command in Claude Code, OpenClaw and DeepSeek Harness, then builds a persona from chat exports as two parts: relationship memory and a six layer character. Its automatic WeChat and iMessage routes need a logged in desktop client, and the README calls the project a beta.

**titanwings/ex-skill** — For the one you can't forget - you're all coding sages running large models. It's giving rebirth era. Welcome to Digital Life 1.0.

- Repository: https://github.com/titanwings/ex-skill
- Stars: 1,096 · Forks: 103
- Language: Python
- License: MIT
- Published: 2026-10-14 · Updated: 2026-10-14 · Language: en
- Canonical page: https://hysenlabs.com/projects/titanwings-ex-skill

## Chat history feeds a two part Skill directory

Nothing here is imported as a Python library. You clone it into a folder the agent harness already scans, then reach it through a slash command instead of an API call. At the repository root sit `SKILL.md`, `prompts/`, `tools/`, `exes/` and `docs/`, so what the model reads at run time is a directory of instructions.

Whatever persona you generate follows the same two part shape. Part A is Relationship Memory: the places you went, the inside jokes only you two get, fight patterns and key timeline events. Part B is Persona, a six layer personality structure. Runtime order is fixed: `Receive message → Check core rules → Retrieve relationship memory → Assess current emotional state → Output in their style`, and it puts the core rules ahead of the memories on every reply. Silence is part of that output rather than a failure, since one sample reply lands 40 minutes after a read receipt and the pause survives into the transcript.

## Six persona layers, and a Correction layer left out

Core Rules, Identity, Expression, Emotional Patterns, Conflict & Boundaries, Triggers: those are the six layers the persona table names, in that order, and the file mentions no others.

A seventh destination turns up elsewhere in the same document. According to the command table, saying `that's not right, they wouldn't say that` writes the correction to a Correction layer. That layer sits outside the six, and no section explains how such a correction is merged into Identity, Expression or Emotional Patterns. Someone deciding where behaviour actually lives inside a generated Skill has to notice that gap alone.

Growth is documented separately: saying `add more messages` imports further chat history and updates the persona without regenerating it.

## Automatic WeChat and iMessage reads depend on a logged in desktop client

Four input routes are listed, and only two of them are automatic. WeChat is marked fully automatic, stored as SQLite, supported on Windows and macOS, and it needs the desktop client still logged in plus the contact name; the README words it as auto-decrypt, auto-extract. iMessage is also fully automatic and also SQLite, but macOS only, matched by phone number or Apple ID and read with no extra step. Screenshots are a manual upload and pasted text is manual input, so both work anywhere a browser does.

The automatic label covers extraction, nothing more. No row in that table asks whether the other person agreed, and the section opens by calling this still a beta version with more sources to come. There is no Android or iOS WeChat route, and no Linux path appears in the install or data source sections either.

## Three harnesses, two clone directory names, one slash command

OpenClaw is the recommended host, and it takes a single clone into the workspace skills folder:

```bash
git clone https://github.com/titanwings/ex-skill ~/.openclaw/workspace/skills/create-ex
```

For Claude Code the README warns that skills are looked up in `.claude/skills/` at the git repo root, and the block below carries the global alternative as well:

```bash
# Install to current project (run at git repo root)
mkdir -p .claude/skills
git clone https://github.com/titanwings/ex-skill .claude/skills/create-ex

# Or install globally (available in all projects)
git clone https://github.com/titanwings/ex-skill ~/.claude/skills/create-ex
```

DeepSeek Harness discovers filesystem skills from `.dsh/skills/` in a project or `$DSH_HOME/skills/`, and no adapter or core workflow change is required:

```bash
# Install to the current project (run at the git repo root)
mkdir -p .dsh/skills
git clone https://github.com/titanwings/ex-skill .dsh/skills/ex-skill

# Or install for all DSH projects
mkdir -p ~/.dsh/skills
git clone https://github.com/titanwings/ex-skill ~/.dsh/skills/ex-skill
```

Two directory names for one repository: `create-ex` under OpenClaw and Claude Code, `ex-skill` under DeepSeek Harness. What you type afterwards is `/create-ex` in all three, so folder and slash command do not line up under DSH, and the README does not explain how that name resolves there. Python dependencies are optional and separate:

```bash
pip3 install -r requirements.txt
```

After the clone, type `/create-ex` and answer the prompts: the name, basic information such as gender, age and zodiac, personality tags like MBTI and attachment style, then the history import. Every field is optional, so a description alone produces a persona, and you open the result with `/{slug}`.

## Version snapshots and rollback, then a permanent delete

Two kinds of instruction sit in the same command table. `/list-exes` lists every persona, `/{slug}` opens one, and `/move-on {slug}` deletes it. Two more arrive as plain sentences rather than as commands: ask for all versions and it shows them, ask for `rollback to v2` and the persona steps back to an earlier snapshot. `add more messages` pulls in more history and updates what already exists.

An asymmetry sits between those two halves. An edit is reversible because every change is kept, while deletion is not: no export, no backup step and no undo are documented for `/move-on`, which the README calls a gentle alias for delete. Run it and the same folder layout remains with the person missing from it.

## A 2025 news post, a 2026 version date, seven translations

A news block inside the README is dated 2025.04.07. It announces a community gallery for shared personas at titanwings.github.io/colleague-skill-site, lists entries such as `罗翔.skill`, and says pull requests are reviewed by hand, which can be slow. The newest version of the project carries the date 2026-04-01, so the announcement sits almost a year earlier, and nothing in the repository accounts for that gap. The most recent push landed on 2026-08-13, months after that version date.

That same file is repeated in seven languages, as README_DE.md, README_EN.md, README_ES.md, README_JA.md, README_PT.md, README_RU.md and README_ZH.md, alongside README.md itself. A badge claims Python 3.9+, the default branch is master, and the project description is written in Chinese. Nothing says whether those translations are kept in step with each other.

## Where the README stops mid table and INSTALL.md takes over

One thing is missing before any of it can be inspected: the README ends mid table. All six persona layers get named, the table header gets printed, and the text inside Core Rules or inside Triggers never appears in the file. Details about the desktop client requirement are deferred to INSTALL.md, and that document is not reproduced.

Root level entries get the same treatment. `docs/`, `prompts/`, `tools/` and `exes/` are named and left unexplained, which means the scripts that open and decrypt the WeChat and iMessage SQLite databases cannot be inspected from what is published here. There is no test command, no continuous integration badge and no minimum version of Claude Code or DeepSeek Harness, so none of the three install paths can be pinned to a specific agent release.

The MIT licence in the README badge covers the code in this repository, and no part of the file addresses what a generated persona owes the person whose messages produced it.

## Why a hand written system prompt is not the same thing

The nearest alternative is a persona you write yourself, as one system prompt inside a chat harness. That difference is mechanical rather than emotional: a hand written prompt is one block of text you edit in place, with no import step, no split between shared memories and character, no incremental `add more messages`, no stored snapshot to roll back to and no delete command beyond removing a file you can see. ex-skill moves all of that into a directory the harness discovers, which is the only reason a single clone fits three different locations.

The ceiling does not move. Seeding stays with you, and the worked example supplies one age, one sign, one personality type, one attachment style and two durations: a woman of 25, Aries, ISFP, avoidant attachment, together 2 years, broke up 3 months ago. A badge links to agentskills.io under the label AgentSkills, yet no conformance level is stated, so portability rests on those three install paths rather than on a standard the project claims.

## Conclusion

Adopt ex-skill if your harness already scans a skill directory and you want persona edits kept as snapshots instead of retyped by hand. Leave it aside if you need one fixed character, or if your chat history lives anywhere except a logged in desktop client on Windows or macOS, where no import route exists. Before the first clone, check that your harness resolves the skill name from the folder name, because DeepSeek Harness installs the repository as ex-skill while the documented command is /create-ex. The README also stops before it shows what fills those six persona layers.

## FAQ

### What does ex-skill actually create?

A skill directory made of two parts: Part A holds relationship memory drawn from your chat history, Part B holds the persona as a six layer personality structure. Nothing is compiled into a model, because the harness reads the directory at run time.

### How do I install ex-skill in Claude Code?

Run the commands at the git repo root so the clone lands in `.claude/skills/`, or clone into `~/.claude/skills/create-ex` to have it in every project. Then type `/create-ex` and answer the prompts for name, basic information, personality tags and chat history, all of which are optional.

### Can ex-skill read WeChat or iMessage messages automatically?

On Windows and macOS it reads WeChat from SQLite while the desktop client stays logged in and you supply the contact name, and on macOS it reads iMessage by phone number or Apple ID. Screenshots and pasted text are the manual fallbacks, and no Android or iOS route is listed.

### How do I delete a persona that ex-skill generated?

`/move-on {slug}` deletes it, and no undo, export or backup step is documented for that command. Asking for all versions or for `rollback to v2` only moves a persona between snapshots while it still exists on disk.

### Under what licence is ex-skill released?

The README badge names MIT and the repository root carries a LICENSE file. Nothing in the file discusses consent from the person whose messages feed a generated persona, or what happens to a shared one.

## Sources

- [Issues](https://github.com/titanwings/ex-skill/issues)
- [License: MIT](https://github.com/titanwings/ex-skill/blob/master/LICENSE)
- [README](https://github.com/titanwings/ex-skill/blob/master/README.md)
- [Releases](https://github.com/titanwings/ex-skill/releases)
- [titanwings/ex-skill on GitHub](https://github.com/titanwings/ex-skill)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/titanwings-ex-skill
