writer-memory
Verifiedby Yeachan-Heo · Updated Apr 16, 2026
Agentic memory system for writers - track characters, relationships, scenes, and themes
See It In Action
Let me explore the project files and check the writer memory system.
Now let me initialize the writer memory and populate it, then run validation and synopsis.
Initializing the writer memory and populating it with all your project data.
Memory initialized with all characters, scenes, relationships, and themes. Now let me run the full analysis.
1. CONTINUITY CHECK
Cross-referencing character notes, scene outlines, and dialogue drafts against the memory:
PASS - No issues found
-
준서 never says "미안" in Scene 2 -- Correct. His taboo word is "미안". He shows care through action (coming back, sitting in silence, eating ramen together). 5 years away and no apology is consistent -- that is the character tension.
-
수아's sudden 존댓말 in Scene 1 ("...내일도 와도 돼요?") -- Consistent. Her speech level is defined as "반말 first, then 존댓말 creeps in as respect grows." The doorway moment works as an unconscious slip -- she's already leaving, guard down. The scene notes correctly tag this as "경계 속 신뢰의 싹."
-
은하 crying in Scene 3 -- Consistent with arc. Her arc is
타인돌봄 -> 자기소외자각 -> 감정직면 -> 불완전한수용. Scene 3 is the "감정직면" beat. The trigger is extraordinary: total loss of her defining ability. This isn't a casual emotional leak -- it's a structural breaking point. The shift to first-person internal narration also signals the narrative itself is acknowledging the breach. -
Color system rules -- All scenes respect the constraint that colors only apply to others. Scene 3 (no colors at all) and Scene 4 (Eunha finally sees her own color, faintly) track a clean progression. No violations of the "one supernatural element only" rule.
WARN - Minor note
- 준서's return reason -- The writer notes say his return is revealed mid-story (은하 엄마의 부고). But Scene 2 doesn't plant any hint of this -- the scene is entirely deflection and small talk. Consider whether Scene 2 needs a micro-seed (e.g., 준서's eyes lingering on the shop interior, or a beat where he almost says something about 은하's mother). Without it, the mid-story reveal could feel abrupt. Not a continuity error, but a gap worth flagging for the pitch.
2. VOICE CHECK -- Flagged Alternate Dialogue
The team flagged Writer B's alternate line for 은하 in Scene 3:
"준서야, 나 무서워. 도와줘. 혼자 있기 싫어."
Verdict: FAIL
| Check | Result |
|---|---|
| Taboo violation | "무서워" -- explicit taboo word |
| Taboo violation | "도와줘" -- explicit taboo word |
| Tone match | Direct emotional expression contradicts 감정억제형 tone |
| Emotional range | Three consecutive vulnerability statements is far outside her baseline of "잔잔한 다정함" |
| Keyword check | None of her characteristic words present |
Why it doesn't work even as a climax break: 은하's arc at this point is "감정직면" -- facing her emotions, not articulating them fluently. The character notes establish that she's someone who cannot name her own feelings. Having her suddenly produce three perfectly labeled emotional statements ("scared," "help me," "don't want to be alone") skips the struggle entirely. It's the destination without the journey.
What the confirmed dialogue does better: The existing Scene 3 has 은하 say "뭐가. 괜찮아." (classic deflection) and then cry silently. 준서 responds to what he sees, not what she says. This preserves her voice -- the emotion breaks through her body, not her words. That gap between what she says and what she does IS the character.
Suggested alternative if the team wants more from this beat:
"나는... 무슨 색이지?"
This stays in-voice (questioning, indirect, rooted in her ability metaphor) while still showing vulnerability. It connects to her lifelong question and lets the emotion land through subtext rather than declaration.
3. EMOTIONAL SYNOPSIS (시놉시스 5요소)
For the leadership pitch:
유리정원 (Glass Garden) -- Emotional Synopsis
1. 주인공 태도 요약 (Protagonist Attitude) 은하는 타인의 마음은 색으로 읽으면서 자기 마음에는 이름을 붙이지 못하는 사람. 돌봄을 주는 것으로 존재를 증명하지만, 정작 "도와줘"라는 말을 한 번도 해본 적 없다.
2. 관계 핵심 구도 (Core Relationship Structure) 세 개의 축: 떠났다 돌아온 사람(준서), 버림받고 찾아온 사람(수아), 그리고 모두를 안아주면서 자기만 안지 못하는 사람(은하). 은하가 타인을 돌보는 구도에서, 타인이 은하를 돌보는 구도로 역전되는 과정이 서사의 뼈대.
3. 정서적 테마 (Emotional Theme) "남의 마음은 보이는데 내 마음은 보이지 않는 사람의 이야기." 공감 능력의 아이러니 -- 남을 이해하는 능력이 자기 자신으로부터 도망치는 도구가 된다. 돌봄의 피로, 그리고 불완전한 이해로도 충분한 관계.
4. 장르 vs 실제감정 대비 (Genre vs Real Emotion) 표면은 힐링 로맨스. 따뜻한 꽃집, 재회, 소꿉친구. 하지만 본질은 자기감정 인식의 서사. 로맨스는 촉매이지 목적이 아님 -- 준서의 존재가 은하를 감정과 대면하게 만들 뿐, 사랑이 그녀를 구원하지는 않는다. 그녀가 스스로를 마주하는 것이 서사의 핵심.
5. 엔딩 정서 잔상 (Ending Emotional Aftertaste) 따뜻한 눈물. 완전한 해피엔딩은 아니다 -- 은하는 자기 색을 처음 보지만 그것이 무슨 색인지는 아직 모른다. "그래그래... 이 색도 괜찮네." 해답이 아니라 질문을 받아들이는 것. 처음으로 자기 감정을 직시하는 순간의 조용한 해방감.
Now let me save this synopsis to the memory.
Synopsis saved to memory. Here's the summary of everything above:
For your pitch deck, the three deliverables:
Continuity -- Clean. All 3 team questions check out (준서's missing "미안", 수아's 존댓말 shift, 은하's crying). One thing to consider planting: a micro-hint in Scene 2 about 준서's real reason for returning, so the mid-story reveal doesn't land cold.
Voice check -- Writer B's alternate line is a hard fail. It hits two of 은하's taboo words ("무서워", "도와줘") and breaks her core voice mechanic (emotion through action/subtext, not declaration). If the team wants more vulnerability in that beat, the line "나는... 무슨 색이지?" stays in-voice while opening the same emotional door.
Synopsis -- Ready above in the 5-element format. The one-line pitch version: A woman who can see everyone's emotions as color but can never see her own -- until the day the colors disappear.
Permissions
| Scope | Description |
|---|---|
| filesystem:read | |
| filesystem:write |
SKILL.md
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.jsonexists - Verify JSON syntax is valid
- Run
/writer-memory statusto 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
FAQ
What does writer-memory do?
Agentic memory system for writers - track characters, relationships, scenes, and themes
When should I use writer-memory?
Use it when you need a repeatable workflow that produces text report.
What does writer-memory output?
In the evaluated run it produced text report.
How do I install or invoke writer-memory?
npx skills add https://github.com/yeachan-heo/oh-my-claudecode --skill writer-memory
Which agents does writer-memory support?
Claude Code
What tools, channels, or permissions does writer-memory need?
It uses no extra tools; channels commonly include text; permissions include filesystem:read, filesystem:write.
Is writer-memory safe to install?
Static analysis marked this skill as medium risk; review side effects and permissions before enabling it.
How is writer-memory different from an MCP or plugin?
A skill packages instructions and workflow conventions; tools, MCP servers, and plugins are dependencies the skill may call during execution.
Does writer-memory outperform not using a skill?
About writer-memory
When to use writer-memory
You want the agent to track character voice and continuity across a long writing project. You need a structured, persistent memory file for scenes, relationships, and themes. You want the agent to validate dialogue consistency or generate a synopsis from stored story context.
When writer-memory is not the right choice
You only need one-off writing help without persistent project memory. You need integration with external publishing, messaging, or research systems rather than local story context management.
What it produces
Produces text report.
Install
npx skills add https://github.com/yeachan-heo/oh-my-claudecode --skill writer-memoryInvoke: Ask Claude Code to use writer-memory for the task.