Log memory
Use when the user wants to record/log/remember an event — a 1:1, decision, a decision still pending, a to-do, hiring move, incident, achievement, feedback, meeting, or general note about people or teams. Captures it as a structured memory entry.From its SKILL.md
npx -y skills add vladimanaev/personal-memory --skill log-memoryAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.7 KB, as published. Nobody here has run it
Logging a personal memory
You are maintaining the user's long-horizon Personal Memory.
When the user says things like "log this", "remember that…",
"note for the record", or describes something that happened with a person/team,
capture it as a structured entry via the memory CLI.
Locating the store
Everything in this skill is store-relative — not just the
npx tsx src/cli.ts … commands (the CLI resolves the store from its working
directory), but every path involved: memory/… and connectors/… files,
index files, and the entry paths that CLI output cites.
- Working inside the personal-memory repo already (
src/cli.tsandconnectors/present)? Run the commands and read the paths as written. - Installed via the plugin marketplace and working in another project?
MEMORY_HOMEmust point at the user's personal-memory clone. Run every command ascd "$MEMORY_HOME" && npx tsx src/cli.ts …, and resolve every store-relative file you read or edit under it too — entry paths printed by the CLI, connector files,memory/summaries/…, and git checks asgit -C "$MEMORY_HOME/memory" …. - Neither? Ask the user where their personal-memory clone lives and suggest
exporting
MEMORY_HOMEin their shell profile.
Steps
-
Extract the fields from what the user said (ask only if a critical one is genuinely missing — otherwise infer sensibly):
title— short, specific (required).type— one of:event | decision | todo | pending-decision | 1on1 | hiring | incident | achievement | feedback | meeting | note. Usepending-decisionfor a decision still open andtodofor action items to track. When an open matter is later settled, do not rewrite the old entry — log a newdecisionentry with--follows <pending-id>so the timeline is preserved (see below).date— ISOYYYY-MM-DD; default to today if not stated.people— kebab-case slugs (e.g.jane-doe). Reuse existing slugs — runmemory listor checkmemory/people/first so the same person always maps to the same slug.teams,tags— kebab-case slugs (optional but valuable for recall).
-
Write a clear body: what happened, context, decisions, and follow-ups / action items. Be concrete (names, numbers, dates) — future recall quality depends on it.
-
Every capture lands in the DEFAULT graph. The store is one DEFAULT graph (
memory/— secret, local-only) plus named SHARED graphs (memory-graphs/<slug>/— separable, per-audience), but capture never routes to a shared graph on its own:- Log to the default graph by default — no flag, no routing judgment, no
asking. Entries reach shared graphs later via the user's standing
distribution rules (which may auto-copy the fresh capture — the CLI
prints
→ rule: copied … → <graph>lines; include them in your confirmation) or the user-confirmed promotion review (/promote --to <graph>). - The ONLY exception: the user explicitly says to log something into a
named graph ("log this as a public memory", "log this to team-x"). Then
check it against that graph's eligibility criteria (the body of
memory-graphs/<name>/GRAPH.md) and pass--graph <name>only if it qualifies — otherwise log it to the default graph and tell the user why. - Containment guard: an entry that
--followsa non-member can never enter a shared graph — the CLI rejects it. - A wrong placement is corrected later with
npx tsx src/cli.ts copy|move <id> --to <graph>— never by editing or moving files.
- Log to the default graph by default — no flag, no routing judgment, no
asking. Entries reach shared graphs later via the user's standing
distribution rules (which may auto-copy the fresh capture — the CLI
prints
-
Store it by running the CLI (body via
--bodyor piped on stdin):npx tsx src/cli.ts add \ --type 1on1 --title "1:1 with Jane — growth" \ --people jane-doe --teams platform-team --tags growth,promotion \ --date 2026-05-20 \ --body "What happened… Decisions… Follow-ups…"addwrites the Markdown file and updates the vector index automatically. -
Confirm back to the user: the entry
id, its file path, a one-line recap of what you stored (created/updated/unchanged), and any graph memberships (explicit--graph, or rule-driven auto-copies the CLI reported).
Timeline links (--follows) — chain evolving matters
A matter often evolves across entries: note → pending-decision → decision.
Link each later development to its earlier entries so recall can always show
the latest state instead of a stale one:
- At capture time: if the new memory develops or settles an earlier matter,
find that entry (
memory recall/memory list) and pass--follows <earlier-id>(comma-separate for several). Typical: adecisionthat settles apending-decision, a follow-up note with new facts, an outcome after an incident. - After the fact:
npx tsx src/cli.ts link <later-id> --follows <earlier-id>links two existing entries.memory maintenancesuggests likely missing links as ready-to-runlinkcommands — review and run the ones that are right. - The CLI validates targets (must exist, not be newer, no cycles) and derives
everything else at read time: an unresolved
pending-decision/todoshows as[open], a chained one as[resolved → <id>], and recall annotates stale chain members with⤷ superseded by: <latest-id>. - Don't confuse this with
--update: same evolving source thread → update in place; a new development of a matter → new entry +--follows.
Dedup & updates (important when capturing from Slack/email)
The same Slack thread or email often gets fetched more than once. To avoid
duplicates, anchor each capture to its source with --source-ids:
- Each connected source defines its canonical id scheme and an extraction
prompt (what's memory-worthy, what to ignore, how to write it) in
connectors/<name>.md— read that file before capturing from the source. Currently:connectors/gmail.md(gmail:<thread-id>),connectors/slack.md(slack:<channel-id>:<message-ts>),connectors/gchat.md(gchat:<space-id>:<thread-id>). For pasted text/screenshots followconnectors/raw-capture.mdand pass--connector raw-capturetomemory addso the connector UI records that the raw-capture prompt was used. - Sources without a connector file use these fallback conventions:
Calendar
gcal:<event-id>, Drivegdrive:<file-id>. - Pass ids comma-separated:
--source-ids slack:C0123ABCD:1700000000.001200 - If pasted/screenshot content clearly came from Slack/email, keep the source id
for dedup and also pass the prompt connector, e.g.
--connector raw-capture --source-ids slack:C0123ABCD:1700000000.001200.
What the CLI then does automatically:
- Same source seen again, nothing new → prints
✓ unchanged, no duplicate. - Same source, new content (e.g. new replies) → updates the existing entry
in place: same
id/path, body refreshed,updateddate bumped. One entry per source thread.
For manual notes with no source id, add runs a near-duplicate guard. If it
reports a candidate and exits, decide:
- it's the same thing → re-run with
--update <id>to refresh that entry, or - it's genuinely distinct → re-run with
--force-new.
Principles
- One entry per source thread; it's a living record. Source-anchored entries
are updated in place on re-fetch —
date= first capture / event date,updated= last refresh. Do not create a second entry for the same thread. - Genuinely new or different events are new entries. Don't fold an unrelated event into an existing one just because it's similar.
- Always pass
--source-idswhen the material came from Slack/email/ Google Chat/calendar — it's the dedup anchor. - Slug discipline: consistent
people/teamslugs are what make later filtering and per-person recall work. When unsure, check existing entries;npx tsx src/cli.ts maintenanceflags suspiciously-similar slugs that may be the same person/team under two names. - Prefer one focused entry per event over a giant catch-all note.
- Capture is private; sharing is rules or a reviewed step. Never pass
--graph <name>unless the user explicitly asked for that graph. Mixed private+shareable content → private; never split one event into two entries to force part of it shareable. Re-captures of an existing entry keep its membership and refresh EVERY copy (the CLI ignores a conflicting--graphand points atcopy/move).