Help us improve
Share bugs, ideas, or general feedback.
From vibekit
Stores, recalls, queries, and audits durable project knowledge as file-backed entries and a working notepad that survives conversation compaction.
npx claudepluginhub rizukirr/vibekit --plugin vibekitHow this skill is triggered — by the user, by Claude, or both
Slash command
/vibekit:memory-dualThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The single durable-knowledge surface for vibekit. Two file-backed regions under `.vibekit/`:
PROACTIVELY query Forgetful MCP (mcp__forgetful__* tools) when starting work on any project, when user references past decisions or patterns, when implementing features that may have been solved before, or when needing context about preferences. Save important decisions, patterns, and architectural insights to memory.
Manages persistent semantic memory across sessions: store/retrieve knowledge/TODOs/issues, hybrid semantic search, hierarchy/tags organization, and maintenance tools.
Provides persistent Obsidian vault memory for coding agents. Auto-orients sessions with TODOs and project overviews, supports lookup of notes/patterns, and writes discoveries using commands like init, lookup, note.
Share bugs, ideas, or general feedback.
The single durable-knowledge surface for vibekit. Two file-backed regions under .vibekit/:
type: frontmatter, not by which directory it lives in.A single append-only log.md chronicles all writes. An auto-maintained INDEX.md catalogs every entry.
All five CLIs (Claude Code, Codex, Gemini, opencode, Pi) read and write the same files identically. No database, no daemon, no runtime API.
brainstorm-lean step 1, brief-compiler CONTEXT enrichment).Do NOT invoke for:
docs/specs/ artifacts produced by brainstorm-lean. Specs reference memory; memory distills patterns from many specs..vibekit/
├── memory/
│ ├── INDEX.md # auto-maintained catalog
│ ├── log.md # append-only operation chronicle
│ └── <key>.md # one file per key, frontmatter + body
└── notepad.md # single file, three sections
<key> is kebab-case, ≤60 chars, descriptive: test-runner, auth-architecture, cache-stampede-postmortem-2026-q1, merge-freeze-2026-q2.
Every entry has this exact frontmatter, then a markdown body:
---
key: <kebab-case>
type: convention | decision | preference | gotcha | contact | deadline | architecture | pattern | debugging | environment | session-log | reference
tags: [<tag>, <tag>]
created: YYYY-MM-DD
updated: YYYY-MM-DD
status: active | stale | superseded
supersedes: <key, optional>
confidence: high | medium | low
---
# <Title>
<body — single paragraph for atomic facts; multi-section markdown for compound documents.
Use h2/h3 for structure when the body has more than one section.>
## See also
- [[<other-key>]] — <one-line reason for the link>
Atomic vs compound is signaled by length and structure, not by separate storage. A convention: test runner is vitest is one paragraph. An architecture: auth flow may be a multi-section document with cross-links. Both are entries.
confidence: low means the entry is a best guess — surface it but flag it. confidence: high means the user confirmed or the codebase verifies it.
Pick exactly one. If a finding does not fit any type, it probably does not belong in memory:
convention — coding/naming/process rules in force.decision — a choice and its rationale (often supersedes another).preference — user/team operational preference.gotcha — non-obvious pitfall.contact — person, team, or service reference.deadline — time-bound fact.architecture — how a subsystem fits together (compound).pattern — a repeatable approach used in multiple places (compound).debugging — playbook for diagnosing a class of issue.environment — how to run/build/test/deploy.session-log — chronicle of a notable run or incident.reference — external links, glossaries.Adding a new type is a deliberate decision that updates this list, not a per-entry expedient. Free-tagging happens via tags, not type.
[[<key>]] is the cross-link syntax for any entry. Plain markdown links ([text](url)) are also fine for external URLs but do not count as cross-references.
[[<key>]] must resolve to an existing entry. audit flags broken links. The skill never auto-creates missing target entries — that path leads to junk.
Single file, three sections, fixed headings. The skill writes/edits within sections; never reorders them.
# Vibekit Notepad
## Priority Context
<HARD LIMIT 500 chars total. Critical facts the next turns need. Bullet list.>
## Working Memory
- [YYYY-MM-DDTHH:MMZ] <one-line breadcrumb>
- ...
## Manual
<user-controlled, free-form, never auto-pruned>
Working Memory entries older than 7 days are pruned on audit. Priority and Manual are never auto-pruned.
read --key <K>Return the entry contents verbatim. If the key does not exist, return not found with three closest keys from INDEX. Never guess.
query --text <T> [--tags <list>] [--type <T>] [--include-superseded]Match against status: active entries by default. Matching is keyword + tag + type — no vector embeddings, no fuzzy. Returns:
hits:
- key: <key>
type: <type>
snippet: <first matching line, verbatim>
score: <integer; tag/type matches weighted higher than body>
The caller synthesizes an answer with [[key]] citations. The skill never paraphrases bodies into the answer — it returns hits and the caller reads entries it cares about.
list [--type <T>] [--tags <list>] [--include-superseded]Read INDEX.md and filter. Returns key + title + type + updated date. Bodies are not loaded.
read --notepad [--section priority|working|manual]Return the full notepad, or the named section verbatim.
write --key <K> --type <T> --confidence <C> [--tags <list>] [--body @file | --body-stdin]Create or update .vibekit/memory/<K>.md. If the key exists, update updated: and replace the body wholesale; never append silently. Preserve created: on update. Update INDEX.md. Append a one-line entry to log.md.
If a different key exists with the same body content (heuristic: identical first line + ≥80% body overlap), REJECT and propose update or supersede.
write --notepad --priority <text>Append <text> to Priority Context. After append, count chars. If total >500, REJECT with the diff between current and limit; do not truncate silently.
write --notepad --working <text>Prepend a timestamped bullet to Working Memory: - [YYYY-MM-DDTHH:MMZ] <text>.
write --notepad --manual <text>Append to Manual section verbatim.
supersede --old <K> --new <K>Mark <old> with status: superseded. Set supersedes: <new> on <new>. Both stay on disk; nothing is deleted. query hides superseded entries by default unless --include-superseded.
delete --key <K> --reason <R>Hard delete. REJECT unless --reason is given. Logged in log.md with the reason verbatim. Cross-references to the deleted key are NOT auto-updated; they show as broken on the next audit and the user fixes them. Default to supersede over delete — project history matters.
classify <finding>Given a free-text finding from a session, decide the right destination. Output:
finding: "<verbatim quote>"
proposed:
surface: entry | notepad-priority | notepad-working | notepad-manual | none
key: <key if entry>
type: <type if entry>
tags: [<tag>, ...]
confidence: <low|medium|high>
reason: <one line>
surface: none is correct when the finding is a code fact (lives in code), a spec fact (lives in docs/specs/), or already-known (already in INDEX). Default to none unless the finding is durable, reusable, and not derivable from the code. Do not write everywhere — that is the dump anti-pattern.
auditconfidence: low and updated: >30 days old as candidates for review.status: active and updated: >180 days old as stale.[[key]] cross-link resolves; report broken links per source key.oversized (consider splitting).superseded entries still linked from active entries.Output:
pruned_working: <count>
stale_low_confidence: [<key>, ...]
stale: [<key>, ...]
index_rebuilt: <bool>
duplicates: [{a: <key>, b: <key>, reason: <string>}]
broken_links: [{from: <key>, to: <key>, line: <n>}]
oversized: [<key>, ...]
superseded_with_active_inbound: [<key>, ...]
Audit is read-mostly. The only writes are the prune + INDEX rebuild. Never delete an entry without explicit user instruction.
These join the never-compress list. Compress narration around them; never the rules themselves.
classify verdict is surface: none. Memory rots when overfilled.confidence: low. Lying about confidence destroys the surface.supersede over delete. Project history matters; rot is preferable to silent deletion of decisions.review-pack may PROPOSE a write after sign-off; the user approves.@./.vibekit/notepad.md or @./.vibekit/memory/INDEX.md to its own entry doc — that is the runtime owner's choice, not this skill's responsibility.write writes one entry + INDEX + log. write --notepad --working prepends one bullet. No drive-by reorganization.git diff-able.classify defaults to surface: none. delete REJECTS without --reason. The skill challenges every write that risks rotting the surface.| Region | Policy |
|---|---|
| Operation announcements ("Stored.", "Pruned 2 entries.") | Compress |
| Frontmatter values | Verbatim |
| Entry bodies | Verbatim |
| Query hits / snippets | Verbatim |
| Notepad Priority Context | Verbatim, hard 500-char limit |
classify reasons | One terse line |
| Audit YAML report | Verbatim |
delete --reason text | Verbatim in log.md |
Cross-link syntax [[key]] | Verbatim, never paraphrased |
| Confidence flags / uncertainty markers | Verbatim |
Other skills MAY invoke memory-dual but are not required to:
brainstorm-lean step 1 — query for prior decisions/architecture in the relevant domain. Surface 1-3 hits before asking clarifying questions.brief-compiler — pull entries cited by the user into the CONTEXT block (verbatim; no compression).review-pack after sign-off — propose a classify pass on findings; with user approval, propose write for entries that generalize.verify-gate — does NOT write. Verification is not knowledge capture.These are suggestions, not hard wires. Each calling skill decides whether the round-trip is worth the tokens.
All operations are file I/O under .vibekit/. Verified portable to:
.claude-plugin/plugin.json..codex-plugin/plugin.json.GEMINI.md via @./skills/memory-dual/SKILL.md..opencode/plugins/vibekit.js (skills directory scan).No runtime-specific shim. No capability gate. No degradation.
confidence: high on a guess. The whole surface depends on this honesty.supersede.[[key]] is a claim that the linked entry is relevant; verify before writing.INDEX.md. Run audit instead.For read-class operations: the requested content, verbatim, with no narration.
For write-class operations: a single short line — Stored: <key>. or Notepad priority updated (412/500 chars). or Updated <key> (+a/-r lines).
For classify: the YAML block exactly as specified above.
For query, list, audit: the YAML structure exactly as specified above.
For delete: Deleted <key>. Reason: <verbatim>.
No structured return value beyond what is documented per operation. The skill is file-producing and user-facing.