From cc-memory
Save important memories from this conversation to the cc-memory database via the anti-patch upsert path (merge / supersede / insert based on similarity to existing memories).
How this skill is triggered — by the user, by Claude, or both
Slash command
/cc-memory:save-memoriesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Review the current conversation and persist **structured memories** through the
Review the current conversation and persist structured memories through the
anti-patch writer (llm.memory_writer.upsert_smart). Never bypass this path:
it auto-decides whether to MERGE (overwrite an existing high-similarity memory),
SUPERSEDE (archive an old version and insert a refined one with a chain link),
or INSERT (genuinely new fact). This prevents stacked duplicates.
Identify, since the last save or session start:
category: one of decision, result, config, bug, task, arch, noteimportance: 1-5 (5=critical/never-forget, 4=important, 3=useful, 2=minor, 1=skip)content: one self-contained sentence with specific values (numbers, file
paths, parameter names). Bad: "tuned the learning rate". Good: "lr=3e-4 picked
over 1e-3 because val_loss flatlined after epoch 8."topic: a short lowercase keyword for grouping (e.g. auth, pipeline, ui)The writer handles dedup, similarity-based reconcile, and MEMORY.md regen
automatically. Do not call db.insert_memory directly.
python3 -c "
import sys
from pathlib import Path
PLUGIN = Path.home() / '.claude' / 'hooks' / 'cc-memory'
sys.path.insert(0, str(PLUGIN / 'cc_memory'))
from core.db import MemoryDB
from llm.memory_writer import upsert_batch
project = str(Path('.').resolve())
db = MemoryDB(Path(project) / 'memory' / 'memory.db')
pid = db.upsert_project(project)
memories = [
# {'category': 'decision', 'content': '...', 'importance': 4, 'topic': 'auth'},
# ADD MEMORIES HERE — see Step 2 for fields
]
counts = upsert_batch(db, pid, None, memories, memory_dir=Path(project) / 'memory')
print(f\"inserted={counts.get('inserted',0)} \"
f\"merged={counts.get('merged',0)} \"
f\"superseded={counts.get('superseded',0)} \"
f\"skipped={counts.get('skipped',0)}\")
"
Tell the user the breakdown:
The merged/superseded counts are good: they mean the writer is preventing the
patch-style stacking the v2.1 anti-patch contract was designed to stop. See
docs/MEMORY_RULES.md for the full contract.
npx claudepluginhub skymanbp/cc-memory --plugin cc-memoryBuilds accessible UIs with shadcn/ui components on Radix UI + Tailwind CSS, plus canvas visuals. For React apps (Next.js, Vite, Remix, Astro), design systems, responsive layouts, themes, dark mode, prototypes.