Refactor high-complexity React components in Dify frontend. Use when `pnpm analyze-component...
npx skills add Yeachan-Heo/oh-my-claudecode --skill "writer-memory"
Install specific skill from multi-skill repository
# Description
Agentic memory system for writers - track characters, relationships, scenes, and themes
# SKILL.md
name: writer-memory
description: Agentic memory system for writers - track characters, relationships, scenes, and themes
argument-hint: "init|char|rel|scene|query|validate|synopsis|status|export [args]"
Writer Memory - Agentic Memory System for Writers
Persistent memory system designed for creative writers, with first-class support for Korean storytelling workflows.
Overview
Writer Memory maintains context across Claude sessions for fiction writers. It tracks:
- Characters (์บ๋ฆญํฐ): Emotional arcs (๊ฐ์ ๊ถค๋), attitudes (ํ๋), dialogue tone (๋์ฌํค), speech levels
- World (์ธ๊ณ๊ด): Settings, rules, atmosphere, constraints
- Relationships (๊ด๊ณ): Character dynamics and evolution over time
- Scenes (์ฅ๋ฉด): Cut composition (์ปท๊ตฌ์ฑ), narration tone, emotional tags
- Themes (ํ ๋ง): Emotional themes (์ ์ํ ๋ง), authorial intent
All data persists in .writer-memory/memory.json for git-friendly collaboration.
Commands
| Command | Action |
|---|---|
/oh-my-claudecode:writer-memory init <project-name> |
Initialize new project memory |
/oh-my-claudecode:writer-memory status |
Show memory overview (character count, scene count, etc) |
/oh-my-claudecode:writer-memory char add <name> |
Add new character |
/oh-my-claudecode:writer-memory char <name> |
View character details |
/oh-my-claudecode:writer-memory char update <name> <field> <value> |
Update character field |
/oh-my-claudecode:writer-memory char list |
List all characters |
/oh-my-claudecode:writer-memory rel add <char1> <char2> <type> |
Add relationship |
/oh-my-claudecode:writer-memory rel <char1> <char2> |
View relationship |
/oh-my-claudecode:writer-memory rel update <char1> <char2> <event> |
Add relationship event |
/oh-my-claudecode:writer-memory scene add <title> |
Add new scene |
/oh-my-claudecode:writer-memory scene <id> |
View scene details |
/oh-my-claudecode:writer-memory scene list |
List all scenes |
/oh-my-claudecode:writer-memory theme add <name> |
Add theme |
/oh-my-claudecode:writer-memory world set <field> <value> |
Set world attribute |
/oh-my-claudecode:writer-memory query <question> |
Query memory naturally (Korean supported) |
/oh-my-claudecode:writer-memory validate <character> <dialogue> |
Check if dialogue matches character tone |
/oh-my-claudecode:writer-memory synopsis |
Generate emotion-focused synopsis |
/oh-my-claudecode:writer-memory export |
Export full memory as readable markdown |
/oh-my-claudecode:writer-memory backup |
Create manual backup |
Memory Types
์บ๋ฆญํฐ ๋ฉ๋ชจ๋ฆฌ (Character Memory)
Tracks individual character attributes essential for consistent portrayal:
| Field | Korean | Description |
|---|---|---|
arc |
๊ฐ์ ๊ถค๋ | Emotional journey (e.g., "์ฒด๋ -> ์๋ง์๊ฐ -> ์ ํ") |
attitude |
ํ๋ | Current disposition toward life/others |
tone |
๋์ฌํค | Dialogue style (e.g., "๋ด๋ฐฑ", "์ง์ค์ ", "ํํผ์ ") |
speechLevel |
๋งํฌ ๋ ๋ฒจ | Formality: ๋ฐ๋ง, ์กด๋๋ง, ํด์ฒด, ํผํฉ |
keywords |
ํต์ฌ ๋จ์ด | Characteristic words/phrases they use |
taboo |
๊ธ๊ธฐ์ด | Words/phrases they would never say |
emotional_baseline |
๊ฐ์ ๊ธฐ์ค์ | Default emotional state |
triggers |
ํธ๋ฆฌ๊ฑฐ | What provokes emotional reactions |
Example:
/writer-memory char add ์๋
/writer-memory char update ์๋ arc "์ฒด๋
-> ์๋ง์๊ฐ -> ์ ํ"
/writer-memory char update ์๋ tone "๋ด๋ฐฑ, ํ์ฌ์ถฉ์ค, ๊ฐ์ ์ต์ "
/writer-memory char update ์๋ speechLevel "ํด์ฒด"
/writer-memory char update ์๋ keywords "๊ทธ๋ฅ, ๋ญ, ๊ด์ฐฎ์"
/writer-memory char update ์๋ taboo "์ฌ๋ํด, ๋ณด๊ณ ์ถ์ด"
์ธ๊ณ๊ด ๋ฉ๋ชจ๋ฆฌ (World Memory)
Establishes the universe your story inhabits:
| Field | Korean | Description |
|---|---|---|
setting |
๋ฐฐ๊ฒฝ | Time, place, social context |
rules |
๊ท์น | How the world operates (magic systems, social norms) |
atmosphere |
๋ถ์๊ธฐ | Overall mood and tone |
constraints |
์ ์ฝ | What cannot happen in this world |
history |
์ญ์ฌ | Relevant backstory |
๊ด๊ณ ๋ฉ๋ชจ๋ฆฌ (Relationship Memory)
Captures the dynamic between characters over time:
| Field | Description |
|---|---|
type |
Base relationship: romantic, familial, friendship, rivalry, professional |
status |
Current state: budding, stable, strained, broken, healing |
power_dynamic |
Who has the upper hand, if any |
events |
Timeline of relationship-changing moments |
tension |
Current unresolved conflicts |
intimacy_level |
Emotional closeness (1-10) |
Example:
/writer-memory rel add ์๋ ํด๋ romantic
/writer-memory rel update ์๋ ํด๋ "์ฒซ ํค์ค - ์๋ ํํผ"
/writer-memory rel update ์๋ ํด๋ "ํด๋ ๊ณ ๋ฐฑ ๊ฑฐ์ ๋นํจ"
/writer-memory rel update ์๋ ํด๋ "์๋ ๋จผ์ ์ ์ก์"
์ฅ๋ฉด ๋ฉ๋ชจ๋ฆฌ (Scene Memory)
Tracks individual scenes and their emotional architecture:
| Field | Korean | Description |
|---|---|---|
title |
์ ๋ชฉ | Scene identifier |
characters |
๋ฑ์ฅ์ธ๋ฌผ | Who appears |
location |
์ฅ์ | Where it happens |
cuts |
์ปท ๊ตฌ์ฑ | Shot-by-shot breakdown |
narration_tone |
๋ด๋ ์ด์ ํค | Narrative voice style |
emotional_tag |
๊ฐ์ ํ๊ทธ | Primary emotions (e.g., "์ค๋ +๋ถ์") |
purpose |
๋ชฉ์ | Why this scene exists in the story |
before_after |
์ ํ ๋ณํ | What changes for characters |
ํ ๋ง ๋ฉ๋ชจ๋ฆฌ (Theme Memory)
Captures the deeper meaning woven through your story:
| Field | Korean | Description |
|---|---|---|
name |
์ด๋ฆ | Theme identifier |
expression |
ํํ ๋ฐฉ์ | How this theme manifests |
scenes |
๊ด๋ จ ์ฅ๋ฉด | Scenes that embody this theme |
character_links |
์บ๋ฆญํฐ ์ฐ๊ฒฐ | Which characters carry this theme |
author_intent |
์๊ฐ ์๋ | What you want readers to feel |
Synopsis Generation (์๋์์ค)
The /synopsis command generates an emotion-focused summary using 5 essential elements:
5 Essential Elements (์๋์์ค 5์์)
- ์ฃผ์ธ๊ณต ํ๋ ์์ฝ (Protagonist Attitude Summary)
- How the protagonist approaches life/love/conflict
- Their core emotional stance
-
Example: "์๋์ ์์ค์ ์๋ฐฉํ๊ธฐ ์ํด ๋จผ์ ํฌ๊ธฐํ๋ ์ฌ๋"
-
๊ด๊ณ ํต์ฌ ๊ตฌ๋ (Core Relationship Structure)
- The central dynamic driving the story
- Power imbalances and tensions
-
Example: "์ฌ๋๋ฐ๋ ์์ ์ฌ๋ํ๋ ์์ ๋ถ๊ท ํ"
-
์ ์์ ํ ๋ง (Emotional Theme)
- The feeling the story evokes
- Not plot, but emotional truth
-
Example: "์์ ์ฅ ํ๋ณต์ ๋ฏฟ์ง ๋ชปํ๋ ๋ถ์"
-
์ฅ๋ฅด vs ์ค์ ๊ฐ์ ๋๋น (Genre vs Real Emotion Contrast)
- Surface genre expectations vs. actual emotional content
-
Example: "๋ก๋งจ์ค์ง๋ง ๋ณธ์ง์ ์๊ธฐ์์ฉ ์์ฌ"
-
์๋ฉ ์ ์ ์์ (Ending Emotional Aftertaste)
- The lingering feeling after the story ends
- Example: "์์ธํ ์๋, ๋ถ์์ ํ ํดํผ์๋ฉ์ ์ฌ์ด"
Character Validation (์บ๋ฆญํฐ ๊ฒ์ฆ)
The /validate command checks if dialogue matches a character's established voice.
What Gets Checked
| Check | Description |
|---|---|
| Speech Level | Does formality match? (๋ฐ๋ง/์กด๋๋ง/ํด์ฒด) |
| Tone Match | Does the emotional register fit? |
| Keyword Usage | Uses characteristic words? |
| Taboo Violation | Uses forbidden words? |
| Emotional Range | Within character's baseline? |
| Context Fit | Appropriate for relationship and scene? |
Validation Results
- PASS: Dialogue is consistent with character
- WARN: Minor inconsistencies, may be intentional
- FAIL: Significant deviation from established voice
Example:
/writer-memory validate ์๋ "์ฌ๋ํด, ํด๋์. ๋๋ฌด ๋ณด๊ณ ์ถ์์ด."
Output:
[FAIL] ์๋ validation failed:
- TABOO: "์ฌ๋ํด" - character avoids direct declarations
- TABOO: "๋ณด๊ณ ์ถ์์ด" - character suppresses longing expressions
- TONE: Too emotionally direct for ์๋'s ๋ด๋ฐฑ style
Suggested alternatives:
- "...์๋ค." (minimal acknowledgment)
- "๋ฆ์๋ค." (deflection to external fact)
- "๋ฐฅ ๋จน์์ด?" (care expressed through practical concern)
Context Query (๋งฅ๋ฝ ์ง์)
Natural language queries against memory, with full Korean support.
Example Queries
/writer-memory query "์๋์ ์ด ์ํฉ์์ ๋ญ๋ผ๊ณ ํ ๊น?"
/writer-memory query "๊ท๋ฆฌ์ ํ์ฌ ๊ฐ์ ์ํ๋?"
/writer-memory query "ํด๋๊ณผ ์๋์ ๊ด๊ณ๋ ์ด๋๊น์ง ์๋?"
/writer-memory query "์ด ์ฅ๋ฉด์ ์ ์์ ๋ถ์๊ธฐ๋?"
/writer-memory query "์๋์ด ๋จผ์ ์ฐ๋ฝํ๋ ๊ฒ ๋ง์?"
/writer-memory query "ํด๋์ด ํ๋ฌ์ ๋ ๋งํฌ๋?"
The system synthesizes answers from all relevant memory types.
Behavior
- On Init: Creates
.writer-memory/memory.jsonwith project metadata and empty collections - Auto-Backup: Changes are backed up before modification to
.writer-memory/backups/ - Korean-First: Emotion vocabulary uses Korean terms throughout
- Session Loading: Memory is loaded on session start for immediate context
- Git-Friendly: JSON formatted for clean diffs and collaboration
Integration
With OMC Notepad System
Writer Memory integrates with .omc/notepad.md:
- Scene ideas can be captured as notes
- Character insights from analysis sessions are preserved
- Cross-reference between notepad and memory
With Architect Agent
For complex character analysis:
Task(subagent_type="oh-my-claudecode:architect",
model="opus",
prompt="Analyze ์๋'s arc across all scenes...")
Character Validation Pipeline
Validation pulls context from:
- Character memory (tone, keywords, taboo)
- Relationship memory (dynamics with dialogue partner)
- Scene memory (current emotional context)
- Theme memory (authorial intent)
Synopsis Builder
Synopsis generation aggregates:
- All character arcs
- Key relationship events
- Scene emotional tags
- Theme expressions
Examples
Full Workflow
# Initialize project
/writer-memory init ๋ด์ ๋์๋ฝ
# Add characters
/writer-memory char add ์๋
/writer-memory char update ์๋ arc "์ฒด๋
-> ์๋ง์๊ฐ -> ์ ํ"
/writer-memory char update ์๋ tone "๋ด๋ฐฑ, ํ์ฌ์ถฉ์ค"
/writer-memory char update ์๋ speechLevel "ํด์ฒด"
/writer-memory char add ํด๋
/writer-memory char update ํด๋ arc "ํ์ -> ๋์ -> ๊ธฐ๋ค๋ฆผ"
/writer-memory char update ํด๋ tone "์ง์ง, ์์ง"
/writer-memory char update ํด๋ speechLevel "๋ฐ๋ง"
# Establish relationship
/writer-memory rel add ์๋ ํด๋ romantic
/writer-memory rel update ์๋ ํด๋ "์ฒซ ๋ง๋จ - ํด๋ ์ผ๋ฐฉ์ ํธ๊ฐ"
/writer-memory rel update ์๋ ํด๋ "์๋ ๊ฑฐ์ "
/writer-memory rel update ์๋ ํด๋ "์ฌํ - ์๋ ๋ด์ ๋์"
# Set world
/writer-memory world set setting "์์ธ, ํ๋, 20๋ ํ๋ฐ ์ง์ฅ์ธ"
/writer-memory world set atmosphere "๋์์ ๊ฑด์กฐํจ ์ ๋ฏธ๋ฌํ ์จ๊ธฐ"
# Add themes
/writer-memory theme add "ํฌ๊ธฐํ์ง ์๋ ์ฌ๋"
/writer-memory theme add "์๊ธฐ ๋ณดํธ์ ๋ฒฝ"
# Add scene
/writer-memory scene add "์ฅ์ ์ฌํ"
# Query for writing
/writer-memory query "์๋์ ์ด๋ณ ์ฅ๋ฉด์์ ์ด๋ค ํค์ผ๋ก ๋งํ ๊น?"
# Validate dialogue
/writer-memory validate ์๋ "ํด๋์, ๊ทธ๋งํ์."
# Generate synopsis
/writer-memory synopsis
# Export for reference
/writer-memory export
Quick Character Check
/writer-memory char ์๋
Output:
## ์๋
**Arc (๊ฐ์ ๊ถค๋):** ์ฒด๋
-> ์๋ง์๊ฐ -> ์ ํ
**Attitude (ํ๋):** ๋ฐฉ์ด์ , ํ์ค์ฃผ์
**Tone (๋์ฌํค):** ๋ด๋ฐฑ, ํ์ฌ์ถฉ์ค
**Speech Level (๋งํฌ):** ํด์ฒด
**Keywords (ํต์ฌ์ด):** ๊ทธ๋ฅ, ๋ญ, ๊ด์ฐฎ์
**Taboo (๊ธ๊ธฐ์ด):** ์ฌ๋ํด, ๋ณด๊ณ ์ถ์ด
**Relationships:**
- ํด๋: romantic (intimacy: 6/10, status: healing)
**Scenes Appeared:** ์ฅ์ ์ฌํ, ์นดํ ๋ํ, ๋ง์ง๋ง ์ ํ
Storage Schema
{
"version": "1.0",
"project": {
"name": "๋ด์ ๋์๋ฝ",
"genre": "๋ก๋งจ์ค",
"created": "2024-01-15T09:00:00Z",
"lastModified": "2024-01-20T14:30:00Z"
},
"characters": {
"์๋": {
"arc": "์ฒด๋
-> ์๋ง์๊ฐ -> ์ ํ",
"attitude": "๋ฐฉ์ด์ , ํ์ค์ฃผ์",
"tone": "๋ด๋ฐฑ, ํ์ฌ์ถฉ์ค",
"speechLevel": "ํด์ฒด",
"keywords": ["๊ทธ๋ฅ", "๋ญ", "๊ด์ฐฎ์"],
"taboo": ["์ฌ๋ํด", "๋ณด๊ณ ์ถ์ด"],
"emotional_baseline": "ํ์จํ ๋ฌด๊ด์ฌ",
"triggers": ["๊ณผ๊ฑฐ ์ธ๊ธ", "๋ฏธ๋ ์ฝ์"]
}
},
"world": {
"setting": "์์ธ, ํ๋, 20๋ ํ๋ฐ ์ง์ฅ์ธ",
"rules": [],
"atmosphere": "๋์์ ๊ฑด์กฐํจ ์ ๋ฏธ๋ฌํ ์จ๊ธฐ",
"constraints": [],
"history": ""
},
"relationships": [
{
"id": "rel_001",
"from": "์๋",
"to": "ํด๋",
"type": "romantic",
"dynamic": "ํด๋ ์ฃผ๋ โ ๊ท ํ",
"speechLevel": "๋ฐ๋ง",
"evolution": [
{ "timestamp": "...", "change": "์ฒซ ๋ง๋จ - ํด๋ ์ผ๋ฐฉ์ ํธ๊ฐ", "catalyst": "์ฐ์ฐํ ๋ง๋จ" },
{ "timestamp": "...", "change": "์๋ ๊ฑฐ์ ", "catalyst": "๊ณผ๊ฑฐ ํธ๋ผ์ฐ๋ง" },
{ "timestamp": "...", "change": "์ฌํ - ์๋ ๋ด์ ๋์", "catalyst": "์ฅ์์์ ์ฌํ" }
],
"notes": "์๋์ ๋ถ์ vs ํด๋์ ๊ธฐ๋ค๋ฆผ",
"created": "..."
}
],
"scenes": [
{
"id": "scene-001",
"title": "์ฅ์ ์ฌํ",
"characters": ["์๋", "ํด๋"],
"location": "ํ์ฌ ์ฅ์",
"cuts": ["ํด๋ ๋จผ์ ๋ฐ๊ฒฌ", "์๋ ๊ตณ์ ํ์ ", "์นจ๋ฌต", "ํด๋ ๋จผ์ ๋ง ๊ฑธ๊ธฐ"],
"narration_tone": "๊ฑด์กฐ์ฒด",
"emotional_tag": "๊ธด์ฅ+๊ทธ๋ฆฌ์",
"purpose": "์ฌํ์ ์ด์ํจ๊ณผ ๋จ์ ๊ฐ์ ์์",
"before_after": "์๋: ๋ฌด๊ด์ฌ -> ๋์"
}
],
"themes": [
{
"name": "ํฌ๊ธฐํ์ง ์๋ ์ฌ๋",
"expression": "ํด๋์ ์ผ๊ด๋ ํ๋",
"scenes": ["์ฅ์ ์ฌํ", "๋ง์ง๋ง ๊ณ ๋ฐฑ"],
"character_links": ["ํด๋"],
"author_intent": "์ง์ฐฉ์ด ์๋ ๋ฏฟ์์ ์ฌ๋"
}
],
"synopsis": {
"protagonist_attitude": "์๋์ ์์ค์ ์๋ฐฉํ๊ธฐ ์ํด ๋จผ์ ํฌ๊ธฐํ๋ ์ฌ๋",
"relationship_structure": "๊ธฐ๋ค๋ฆฌ๋ ์์ ๋๋ง์น๋ ์์ ์ค๋ค๋ฆฌ๊ธฐ",
"emotional_theme": "์ฌ๋๋ฐ์ ์๊ฒฉ์ ๋ํ ์์ฌ",
"genre_contrast": "๋ก๋งจ์ค์ง๋ง ๋ณธ์ง์ ์๊ธฐ์์ฉ ์์ฌ",
"ending_aftertaste": "๋ถ์์ ํ์ง๋ง ๋ฐ๋ปํ ์ ํ์ ์ฌ์ด"
}
}
File Structure
.writer-memory/
โโโ memory.json # Main memory file
โโโ backups/ # Auto-backups before changes
โ โโโ memory-2024-01-15-090000.json
โ โโโ memory-2024-01-20-143000.json
โโโ exports/ # Markdown exports
โโโ export-2024-01-20.md
Tips for Writers
- Start with Characters: Build character memories before scenes
- Update Relationships After Key Scenes: Track evolution actively
- Use Validation While Writing: Catch voice inconsistencies early
- Query Before Difficult Scenes: Let the system remind you of context
- Regular Synopsis: Generate periodically to check thematic coherence
- Backup Before Major Changes: Use
/backupbefore significant story pivots
Troubleshooting
Memory not loading?
- Check .writer-memory/memory.json exists
- Verify JSON syntax is valid
- Run /writer-memory status to diagnose
Validation too strict?
- Review taboo list for unintended entries
- Consider if character is growing (arc progression)
- Intentional breaks from pattern are valid for dramatic moments
Query not finding context?
- Ensure relevant data is in memory
- Try more specific queries
- Check character names match exactly
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.