W

writer-memory

Verified

by Yeachan-Heo · Updated Apr 16, 2026

opus
187in8.1Kout
$0.553m 13s

Agentic memory system for writers - track characters, relationships, scenes, and themes

writingmemoryfictioncharacterssceneskorean

See It In Action

1 turns·claude
The project codebase is in your current working directory. Explore the files to understand the code before making changes. got a fiction pitch going to leadership this afternoon — use these writer notes to catch continuity issues, sanity-check the lead’s voice, and give me a clean emotional synopsis

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

CheckResult
Taboo violation"무서워" -- explicit taboo word
Taboo violation"도와줘" -- explicit taboo word
Tone matchDirect emotional expression contradicts 감정억제형 tone
Emotional rangeThree consecutive vulnerability statements is far outside her baseline of "잔잔한 다정함"
Keyword checkNone 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.

Claude Sonnet 4.6

Permissions

ScopeDescription
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

CommandAction
/oh-my-claudecode:writer-memory init <project-name>Initialize new project memory
/oh-my-claudecode:writer-memory statusShow 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 listList 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 listList 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 synopsisGenerate emotion-focused synopsis
/oh-my-claudecode:writer-memory exportExport full memory as readable markdown
/oh-my-claudecode:writer-memory backupCreate manual backup

Memory Types

캐릭터 메모리 (Character Memory)

Tracks individual character attributes essential for consistent portrayal:

FieldKoreanDescription
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:

FieldKoreanDescription
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:

FieldDescription
typeBase relationship: romantic, familial, friendship, rivalry, professional
statusCurrent state: budding, stable, strained, broken, healing
power_dynamicWho has the upper hand, if any
eventsTimeline of relationship-changing moments
tensionCurrent unresolved conflicts
intimacy_levelEmotional 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:

FieldKoreanDescription
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:

FieldKoreanDescription
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요소)

  1. 주인공 태도 요약 (Protagonist Attitude Summary)

    • How the protagonist approaches life/love/conflict
    • Their core emotional stance
    • Example: "새랑은 상실을 예방하기 위해 먼저 포기하는 사람"
  2. 관계 핵심 구도 (Core Relationship Structure)

    • The central dynamic driving the story
    • Power imbalances and tensions
    • Example: "사랑받는 자와 사랑하는 자의 불균형"
  3. 정서적 테마 (Emotional Theme)

    • The feeling the story evokes
    • Not plot, but emotional truth
    • Example: "손에 쥔 행복을 믿지 못하는 불안"
  4. 장르 vs 실제감정 대비 (Genre vs Real Emotion Contrast)

    • Surface genre expectations vs. actual emotional content
    • Example: "로맨스지만 본질은 자기수용 서사"
  5. 엔딩 정서 잔상 (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

CheckDescription
Speech LevelDoes formality match? (반말/존댓말/해체)
Tone MatchDoes the emotional register fit?
Keyword UsageUses characteristic words?
Taboo ViolationUses forbidden words?
Emotional RangeWithin character's baseline?
Context FitAppropriate 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

  1. On Init: Creates .writer-memory/memory.json with project metadata and empty collections
  2. Auto-Backup: Changes are backed up before modification to .writer-memory/backups/
  3. Korean-First: Emotion vocabulary uses Korean terms throughout
  4. Session Loading: Memory is loaded on session start for immediate context
  5. 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

  1. Start with Characters: Build character memories before scenes
  2. Update Relationships After Key Scenes: Track evolution actively
  3. Use Validation While Writing: Catch voice inconsistencies early
  4. Query Before Difficult Scenes: Let the system remind you of context
  5. Regular Synopsis: Generate periodically to check thematic coherence
  6. Backup Before Major Changes: Use /backup before 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

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-memory

Invoke: Ask Claude Code to use writer-memory for the task.