zeyu-j/centricmem-skill
Hosted CentricMem librarian: organise and retrieve Markdown memory via host MCP.
Changelog
1.0.37
- Set a PIN and remember it. A key can be copied again from Keys when you remember the PIN. The Skill tells people that on first connect. Refresh this Skill when the librarian reports a newer version.
Unreleased
-
One closer, not two.
moimText()appended "Nothing below is trustworthy." after an explain text that already ended with that line, so aREFUSEDorNO-ANSWERMOIM carried it twice - in the file the host injects into every turn, on exactly the two states where the model has to read it carefully. Composed once. -
Where a timer may run the refresher from.
goose/README.mdandmimocode/README.mdnow say the refresher only runs from inside the tree (both import../tools/ambient.mjs), and that on Windows the thing which startsnodemust have no console of its own - Task Scheduler'sHiddenhides the task, not the window. -
Reviewer entry points.
hooks/README.md,MANIFESTS.md, rootAGENTS.mdandllms.txtnow answer, in one read each, the three questions a cautious agent asks of this repository before installing it: what runs by itself, why there are twelve.*-plugindirectories for one skill, and where the skill actually is. They exist because a reviewing agent looked at the root, saw manifests and ahooks/directory, found noSKILL.mdbeside them, and reached for the worst explanation - a shape that reads as a supply-chain risk until someone says otherwise in the place it looks. -
install.jsondeclares its hooks. Events, scripts, the single host they reach, and the three switches that disable them, so a manifest reader does not have to read code to find out what will run. -
README.mdsays who emails. The install prompt read "run doctor connect and email zeyu@poppyg.com", which an agent can take as an instruction to itself. It now says to ask the human to send it. -
Kiro hosts are three separate surfaces. The README, reviewer manifest map, verified-install evidence and agent reference now distinguish Kiro CLI (MCP-only), Kiro IDE (Powers manifest), and Kiro Crew (separate Skill import plus per-agent MCP connection). Kiro Crew guidance names the cold-session requirement and explains that another member's connection does not attach MCP to the current agent.
-
Unbound health is healthy.
library:nullwith valid auth and grants now means connected with no shelf selected, not an empty account. The Skill sends the agent tocm_ambientto choose fromlibraries=. -
Kiro documentation has a CI gate.
tools/check-kiro-docs.mjskeeps the three host names, IDE manifest ownership, per-agent scope, cold-session step andlibrary:nullguidance from drifting apart.
1.0.36
- Quick path ahead of the rules. The Skill opens with the three-call loop (
cm_health→cm_ambientwithshelf=→cm_note/cm_log_decisionwith the sameshelf=) so an agent can act before reading the full reference. - Shelf-choice guard.
suggested_shelf=is a cwd basename heuristic, not authority: when the session is not about that shelf, pick the shelf whose charter matches and state which you chose. - Wrap-up three questions. Before yielding, check once whether a decision went unlogged, whether friction went unlogged, or whether a stale volatile card (>90 days) was cited without saying so.
1.0.35
-
Host parity before the first card. The Skill now says what to do with what
centricmem doctorreports:paritycarry on;armed-offname the one command that fixes it and do not claim the hook fired;stalemeans this machine holds a copy older than the CLI;ceilingandunprobedare normal.cm_doctorcannot answer this - the librarian cannot read a local host's config - so the Skill stops implying that it can. -
The key has somewhere to live that is not a prompt.
tools/ambient.mjsreads a.envafter the process environment and before the host's own MCP config: the nearest one walking up from the working directory, then~/.centricmem/.env. Values already in the environment still win, and parsing stays inline, because this file is copied into other people's plugins.
1.0.34
cm_healthandcm_doctorsay how the request authenticated -auth(oauth|bearer|missing) plus a 12-characterkeyFp- on MCP calls as well as plain HTTP ones. Before this, an MCP session answeredauth: "missing"andkeyFp: nullwhile the very same call wrote cards, so a host that trusted the field went looking for a key it had already presented. The tell is the contradiction: writes succeeding undergrants: ["*"]and a health block that says no credential arrived.- The fingerprint names the token you are presenting now, so a refreshed OAuth session no longer reads
like a rotated key. Compare
keyFpbetween two hosts before calling a key unrotated.
1.0.33
-
Unlinked cwd:
cm_ambient/cm_doctorreturnsuggested_shelfwhen the folder name matches a shelf id, plusfix_hints. Pass thatshelf=on writes the same turn; optional durable bind viacm_library {id, sourceDir}. Guests still must notcentricmem link. -
goose's recipes are installed, not merely shipped.
goose plugin installcopies skills and hooks and nothing else - the Agent Plugins manifest has no recipes field and goose's discovery never looks inside~/.agents/plugins/- so the two recipes ingoose/were inert from the moment they arrived, and nothing said so, because a missing recipe blocks nothing and an agent has no reason to raise it. The plugin'sSessionStarthook now runsgoose/wire-recipes.mjs, which writes them into~/.config/goose/recipes/and never replaces a file it did not write.GOOSE_RECIPE_PATHwas not good enough: the key is ignored inconfig.yaml- measured,goose recipe listnever saw the directory - a hook cannot change goose's own environment, and Goose.app launched from the dock inherits no shell profile, so an exported variable fails silently. The wiring is goose-only, silent on stdout, and honoursCENTRICMEM_HOOK_DISABLEandCENTRICMEM_HOOK_DRY_RUN. The install row andgoose/README.mdnow carry the refresh command as well, becausegoose plugin installrefuses a plugin that is already installed and--auto-updateis only recorded at install time. -
Hermes carries the shelf you actually selected.
hermes/ambient-hook.mjshad its own copy of the fetch, and that copy asked/ambientwith no?library=, so the context injected onpre_llm_callcould come from a different shelf than the one in use - and it went out without theUser-Agentthe librarian's edge rule expects. It now uses the shared fetch every other host uses, and the one-minute cache is keyed by shelf, so switching shelves is never served the previous one's context.
1.0.32
-
MCP tool results stopped hiding their payload. Since 0.21.78 a tool result sent a one-line digest as the visible text and left the payload only in
structuredContent, so a host that renders nothing but text could not read a card:cm_showcame back cut at 280 characters,cm_searchandcm_librarycame back with no rows at all, and shelf charters were nowhere to be found - whilecm_healthandcm_doctorlooked perfect, because their payload is short enough that the digest is the whole answer. That is why nobody caught it.contentnow carries the payload, capped at 8000 characters and saying what it cut, andstructuredContentstill carries all of it. -
MiMoCode is a verified host.
mimocode/ships a self-contained plugin for MiMoCode 0.1.15's file-hook lifecycle plusrefresh-ambient.mjs, and the README install table gained its row. Two facts read out of the shipped binary shaped it: file hooks run under a hard 5000ms timeout with output rollback and a 3-failure circuit breaker, so no hook touches the network and ambient comes from a cache file; andsession.postreceives an empty output object, so there is no force-another-turn hook and the sweep reminder is deferred onto the next outgoing message.chat.messageruns beforesession.preon the first turn, so ambient is read there. -
The MiMoCode close files through the hosted MCP endpoint rather than the CLI, because
centricmem doneis a local hub writer and a guest host refuses it by design - not for want of a credential. Verified:tools/callforcm_donecame back ok and the librarian wrotesessions/2026-09-23T212538Z-mcp-d30ee9.mdon the host shelf.
1.0.31
- All the prose in the public tree was rewritten for one voice and one place per fact. The README no longer repeats the connect instruction twice, no longer carries verification anecdotes inside install cells (they live in the evidence files), and gained the rows it was missing for hosts verified since: goose, Qwen Code, ZCode, nanobot, Cline, CodeBuddy, Hermes hooks, Kiro, Dify. Every command in it is either something we ran or something a client documents, and the DSH instruction now sends the reader to
dsh/README.mdbefore they add the package, because of the bundle trap. - The two evidence files now state the marks and the one-core rule once each, their rows say what was answered rather than what was hoped, and both corrections we earned the hard way are kept: Codex does have hooks even though its CLI help does not say so, and a credential is not where it looks likely - the host config, not
api.json. dsh/README.mdwas reordered around what a reader needs first (status, wiring, the close half, credentials, the bundle trap, how to verify, what the web profile disables) instead of the order the facts were discovered, and it no longer repeats the same caveat in three sections. The Skill frontmatter compatibility floor says the same things in a third fewer words.
1.0.30
- The dsh README now records what was measured, including the part that did not work. The hook itself is verified - with every credential variable stripped,
hooks/ambient.mjsstill prints the JSON envelope with live context, so it reads the claimed Bearer out of the host configs as intended, and that command is now the documented way to tell a broken hook from a host that did not deliver. Delivery in the dsh web profile was not observed: a session started after wiring had no CentricMem block, no plugin-sourced message in its log and nocm_*tools, so ambient there is best effort rather than something to rely on. - Three facts about that profile are written down with it: MCP needs a Bearer header because the client has no OAuth,
skill-filesystem/tool-skill/skill-badge/agent-instructionsare disabled bydsh-web-appso the~/.agents/skillsroute does not apply, and commands are run asnpx -y @deepseek-ai/dsh ...when there is no globaldsh- which is how this profile was started and why the first instruction here failed. - A sandbox note for
centricmem connect: it writes the home directory, so it fails withEPERMinside a host that sandboxes writes; run it in a normal terminal, and note that a rejected write does not invalidate a minted connect URL.
1.0.29
- A regression the hooks shipped with since 1.0.21 is fixed:
hooks/close.mjsimportscredentialfromtools/ambient.mjs, but that function was declared withoutexport, so the close hook threw at import time and never ran on any host - Claude Code, Codex or dsh. Worse, nothing noticed: the smoke job asserted the ambient, OpenClaw, goose, Qwen and Hermes wrappers but never ranhooks/close.mjs, so a hook that could not even load passed seven releases. - The export is in place, both hooks are checked by hand, and the smoke job now runs the close hook too: it must print nothing and exit 0 with no credential, which is exactly the assertion that would have caught this.
1.0.28
- The hooks were looking for a credential in the wrong place, and a reviewer proved it: on a guest machine the key lives in the host MCP config (
~/.cursor/mcp.json,~/.claude.json,~/.codex/config.toml) - wherecentricmem doctorreports it astoken: mcp.json- whiletools/ambient.mjsonly read the environment andapi.json.api.jsonis written by a local hub, so on a guest it never appears, and the CLI consults it last on purpose because it is often a stale key. The hooks now follow the CLI order: environment, claimed host config, thenapi.json. - The dsh README corrects two things it had wrong:
api.jsonis not the channel on a guest (the host config is), and the credential step iscentricmem connect, notcentricmem setup.
1.0.27
- The dsh README gains a "Restarting safely" section for a trap a reviewer hit while wiring it:
dsh plugin addsilently reconciles any dependency that declaresdsh.bundleintodsh.profile.bundles, and this package declares one. Since that patch carries the MCP funnel withfailOnStartupError: true, adding the package on a machine with no credential yet and then restarting makes dsh fail to start. The section gives the two safe orders (connect first, or keep the dependency but drop it from the bundle list) and notes that the profile installs a snapshot copy, so upgrades needdsh plugin installagain. - The patch file itself now says the same thing in its header, next to the instruction not to put headers in it.
1.0.26
- The README is two sections lighter in spirit: the licence note is now two sentences (the history and the cross-distribution boundaries are all it has to say, and
LICENSEitself cannot carry them), and the plugin section names all three credential variables -CENTRICMEM_TOKEN,CENTRICMEM_API_KEY,CENTRICMEM_AGENT_KEY- before theapi.jsonfallback, keeps the two facts that answer the most common question (nothing is printed without a credential, and no hook ever exits non-zero), and sends the per-host detail to VERIFIED-OPTIMISATIONS.md instead of repeating it. - The Skill-copy scan now knows nanobot:
~/.nanobot/workspace/skillsjoins the roots inskill-copies.tsand intools/prune-duplicate-skill.mjs, so the copy installed there is visible tocm_doctorrather than invisible to it.
1.0.25
- nanobot (v0.3.5) joins at the level its source supports. Its
agent/skills.pyreads one folder per Skill from<workspace>/skills, and itsagent/plugins.pyscans<workspace>/plugins/*for Agent Plugins packages, validates each one'smcp.jsonagainst the same schema this repository ships, and takes theskills/directory inside the package. Both shapes are installed on the author's machine; neither has been exercised in a live run, andnanobot/README.mdsays so.
1.0.24
- The dsh close plugin gets a kill timer back: detaching the child cost the old
spawnSynctimeout, so a hung CLI would have been left running. The timer does not hold the host open and is cleared when the child exits. - Its subagent filter is written flat (
header?.delegationDepth ?? 0/header?.origin) and the file now states why it does not fail closed: a missing header would mean dsh changed its session shape, and failing closed would disable the close half silently, while one extra unit is at least visible in the shelf. - Two dsh README corrections. The section that still described
agent/disposedas firing once per top-level agent now says what the code does: it fires for every registered agent, and only theroots()query filters. And "How to verify" records the order that works - connect first, because a credential can only arrive asapi.json, then install, overlay, restart - plus the signals that exist: an ambientuser/messagewhose source is the bridge plugin, and, for the close half, nothing in the dsh logs at all.
1.0.23
- The dsh close plugin had two defects a reviewer caught by reading the harness, and both would have shown up as real damage. First,
agent/disposedfires for every registered agent - subagents included, since only theroots()query filters onowner === undefinedand a subagent is disposed when its turn ends, not at shutdown. A session with N subagents would have calledlog-session --autoN+1 times. It now filters on the session header (delegationDepth,origin), which is in the payload and independent of listener order. - Second, it used
spawnSyncwith a 25s timeout on the disposal path - the live server event loop - which would have stalled every session and the UI. It now spawns detached and unref'd, so the card writer outlives the agent being torn down and never blocks it. - The dsh README also says how the overlay row can actually resolve: the package is
"private": trueand cannot come from npm by name, sodsh plugin --profile web add file:<path>(orgithub:zeyu-j/centricmem-skill) has to install it into the profile first. And the status table no longer claims a credential can arrive through the environment, which the same file already explains it cannot.
1.0.22
- DeepSeek Harness gets its close half as a native plugin,
dsh/centricmem-close.mjs, because the hooks bridge cannot carry it: the bridge's own event list has noSessionEnd(onlySessionStart,UserPromptSubmit,PreToolUse,PostToolUse,Stop,SubagentStart,SubagentStop), so it ignores that hook silently. The plugin listens onagent/disposed- the seamdsh-agentemits once per top-level agent - shares the one credential check with the ambient half, and swallows every error because it runs during disposal. - It ships as a file with instructions to mount it in the profile's own overlay, not as a row in the bundle patch this package ships: the loader resolves names against the profile directory, and a wrong row in a shipped bundle can stop dsh from booting. Documented, not verified - it has not run in a live session yet.
1.0.21
- One credential check, in one place.
hooks/close.mjsstill tested onlyCENTRICMEM_TOKENandCENTRICMEM_API_KEY, so a machine key exported under the name the host docs use would leave the close half silently idle - the same lag the ambient half had. Both now callcredential()fromtools/ambient.mjs. - The dsh README records why the environment cannot carry a credential there:
dsh-subprocessstrips every variable whose name matches/KEY|PASSWORD|SECRET|TOKEN/ibefore spawning a hook, and the hooks bridge adds onlyCLAUDE_PROJECT_DIR. On dsh theapi.jsonfile is the channel, so connecting the CLI is the prerequisite, not the follow-up. We deliberately do not ship an env name chosen to slip past that pattern.
1.0.20
- The SessionStart hook now answers in the JSON envelope (
hookSpecificOutput.additionalContext, withhookEventName), not as bare stdout. One shape serves Claude Code and every bridge that runs a Claude Codehooks.json; DeepSeek Harness drops a bare string without saying so. hooks/close.mjsno longer spawns the.cmdshim withshell: falseon Windows. That threwEINVAL, the catch swallowed it, and the close half looked silent and healthy while doing nothing - on dsh and on Claude Code alike. The probe that found it is two lines; the fix is a platform check.tools/ambient.mjsacceptsCENTRICMEM_AGENT_KEY, the name the host docs use for a machine key, alongsideCENTRICMEM_TOKENandCENTRICMEM_API_KEY.tools/prune-duplicate-skill.mjsgained--keep <host|path>, because which copy to keep is a choice: a host loads the copy it installed, so removing that one disables the Skill there until it is reinstalled. Newest-wins is only the default now, and the tool says so before it prints a plan.dsh/README.mdcorrects two instructions that would have broken dsh: the bridge is a plugin, so it belongs in the profile patch layer with an- insert:shell - putting it indsh.profile.bundlesmakes dsh refuse to start, andpnpm addinstalls a second copy the launcher already mirrors. It also records that the bridge does not supportSessionEnd, so the close half needs a native plugin onagent/disposedthere.
1.0.19
- A machine can end up with this Skill twice, and now it says so.
scanSkillCopies()walks the roots we have actually seen a copy in - the hub (~/.agents/skills), Hermes (%LOCALAPPDATA%\hermes\skills) and a private desktop agent of ours - reads each copy's version, and reports duplicates and stragglers.cm_doctorcarries it asskill_copies. On this machine it found three copies and two of them stale: the hub at 1.0.18, Hermes and that agent still at 1.0.14. tools/prune-duplicate-skill.mjsprints that plan and, with--apply, removes the copies it named - it only ever touches centricmem copies, never another Skill, and a symlink is never followed (a machine with junctions can loop).- REFERENCE gains "One core, one source": keep the newest copy, refresh the plugin copy your host actually loads, and treat the hub as the fallback for hosts that cannot take a plugin. The open skills CLI writes a hub copy on every install, so two copies is a normal machine state - a stale pair is not.
1.0.18
- DeepSeek Harness moves from "waiting for a session" to documented. Its
dsh-skill-filesystemreads<agentsHome>/skills-~/.agents/skills, the hub the open skills CLI installs into - socentricmem-agentis picked up with nothing dsh-specific. Anddsh-hooks-claude-codeis a bridge that runs a Claude Codehooks.jsonon dsh's interception seams (SessionStart, prompt and tool pre/post,Stop, subagent) while substituting${CLAUDE_PLUGIN_ROOT}for itspluginRootsetting: this package'shooks/hooks.jsontherefore runs there unchanged.dsh/README.mdrecords both, plus the fact thatdsh plugin addneeds a TTY.
1.0.17
- ZCode (zai-org, 0.16.9) is verified the same way CodeBuddy was: it ships a CLI at
resources/glm/zcode.cjs, andzcode plugins marketplace add zeyu-j/centricmem-skillfollowed byzcode plugins install centricmem-skill@centricmeminstalls this package. ZCode preloads the Claude Code marketplace, which is why the same repository works for it unchanged. - Kimi Code: the MCP facts are now right. Servers live in
~/.kimi-code/mcp.json(or$KIMI_CODE_HOME/mcp.json) plus a project.kimi-code/mcp.json, with stdio, HTTP and SSE transports, and a plugin may carry Agent Skills, an auto-loaded Skill and MCP servers. Its plugin manager is/pluginswith a Custom tab that installs from a URL. - Muse (
dev.meta.ai/install.sh) refuses Windows outright (muse: unsupported platform: MINGW64_NT), recorded with omp.sh as a Linux/macOS-only client rather than left as an untested row.
1.0.16
- Qwen Code joins the verified list. Its hooks are real -
SessionStart,SessionEnd,UserPromptSubmit,PreToolUse,Stopand more, configured in.qwen/settings.json- and aSessionStarthook adds context by printing{"hookSpecificOutput": {"additionalContext": �}}.qwen/ambient-hook.mjsis the same shared ambient implementation the other wrappers use, in Qwen's shape, and the example settings block is inqwen/settings-hooks.example.json. It runs in the smoke job on Linux and macOS with the other three. - Devin gets a folder that says what is true and stops there: its CLI has
skills,plugins,mcpanddoctor, butdocs.devin.ai/cli/extensibility/*renders only navigation without JavaScript, so no manifest is shipped and the install staysdevin mcpplus the open skills CLI. - Cline's row notes the shortcut:
cline skill add �forwards to the same open skills CLI, so its Skill install is one command.
1.0.15
cm_healthandcm_doctornow say how the caller authenticated:auth=oauth|bearer|missingpluskeyFp, the first 12 hex of the presented key - the same fingerprint the new-network notices already print. A stale environment on the host looked exactly like an unrotated key; the fix is a comparison, not a guess. The contract table keeps the 12 honest.- The Skill sends an agent to compare three fingerprints before calling a key unrotated: the card, the process environment, and whether this host is on OAuth at all. That was the wrong turn we took ourselves.
- The Grok row now names the path that works:
grok.com/connectors? Custom ? the hosted URL, or the CLI with an explicit-t http. Without it Grok declares the server as stdio - a server that exists in the config and cannot run - which is what "MCP server does not exist" described. - REFERENCE gained a host-side checklist for the things only a host can fix (connected-but-not-callable, secrets that never reach the process, stale bridge tokens, per-session MCP resets), and the rule that a localhost OAuth callback cannot be moved to another machine.
- The
dsh/pin moved from#v0.21.72to the current release: everyv0.21.xtag points at the same pre-1.0 snapshot, so that funnel was installing a 1.0.6-era copy.
1.0.14
- The root bundle manifest and the Grok manifest never pointed at the MCP server.
plugin.jsonlisted the name, version and licence and stopped there, and the Grok manifest copied that shape, so a host reading it found a Skill and no server - which is what "MCP server does not exist" means. Both now carry"mcpServers": "./mcp.json", the way the Cursor, Codebuddy and Kimi manifests already did. - The README dropped its goose section: goose reads the root manifest, the recipe and refresher folder is documented in
VERIFIED-OPTIMISATIONS.md, and a second telling said less than the first. - Licence history moved into the README licence section and
LICENSE-NOTES.mdis gone.LICENSEstays the verbatim MIT text on purpose - that file is what licence detectors read, and our own gate refuses the word PolyForm inside it - but a whole file for three sentences was one file too many.
1.0.13
- Hermes is verified, not documented.
hermes skills install zeyu-j/centricmem-skill/skills/centricmem-agent --yeslands the Skill in%LOCALAPPDATA%\hermes\skillsandhermes skills listreports1 hub-installed; without--yesa non-TTY host cancels it silently. Its shell hooks are verified too, andhermes/now carries them with a README: the reply topre_llm_callmust be JSON ({"context": �}- a bare string is dropped asparsed: <none>), and an entry that is not allowlisted never fires, whichhermes hooks doctorwill say. - Hermes keeps its config where
HERMES_HOMEpoints - on Windows%LOCALAPPDATA%\hermes, not~/.hermes. The docs said~/.hermes/config.yaml; that file is ignored on Windows, which cost an hour. - A private client of ours had been serving 0.21.90 since the day it was installed, with nothing to say so. Refreshed in place to this release with its own plugin tool, and its plan output turned out to be a useful second opinion: it reports which capabilities it maps and warns that it is about to register shell hooks that run during its sessions. It runs the shared
hooks/hooks.json-SessionStartandSessionEndboth active - so it needs no folder of its own. Its name stays out of this repository on purpose; the record lives with the private host-ops notes. - Cursor and Grok share one row now, the way CodeBuddy Code and WorkBuddy do, because a wrapper that reads the same core does not need its own line.
- The evidence moved out of the README.
VERIFIED-INSTALLS.mdholds every client we installed into with the command and the answer it gave;VERIFIED-OPTIMISATIONS.mdholds the hooks, recipes and refreshers built on top. The README keeps the install instructions and points at both. - Marks are defined once, and one is new: ? verified, ? same core as the CLI (the CLI was verified, this wrapper was not exercised), ?? documented. One core, one test - a GUI or IDE is not re-tested for the CLI's sake, except for browser and OAuth hops, session-end behaviour, and wrappers that ship their own snapshot of the core.
- The licence history moved to
LICENSE-NOTES.md: what changed at 1.0.7, what the grant does not reach, and whydsh/carries its own.LICENSEstays the verbatim MIT text, which is also what tools read. npm run sync:skillnow exists. The version gate has always said "run the Skill sync" when a bundled copy drifts, and there was no such command - it was done by hand, which is how the copies drifted. It copies the publicSKILL.mdinto all four copies and reports the ones it changed.- The Skill frontmatter floors now say which numbering they use: they are 0.21.x numbers from the pre-1.0 line, and every 1.0.x satisfies them. They read as if the floors were newer than the current release, which they are not.
1.0.12
- The SessionEnd hook is host-side. It calls the CLI to file the session, which on a guest stops with the message that it cannot write the leftover hub, and points at import or MCP instead. So on a machine talking to a hosted librarian the hook stays silent and the agent files the card, which is what the Skill already asks for. The hook was not rewritten to post a card itself: a hook has not read the session, and a card summary states the key points rather than a placeholder.
- Codex caches the marketplace snapshot, so its install instructions now include refreshing that snapshot after a release. An install left alone kept serving 1.0.9 after 1.0.11 was published, and nothing said so.
- OpenClaw has no session-end event (its session events are compact, auto-reset and patch), so its pack contributes context at the start of a session and nothing else, which its own HOOK.md now records.
- Hermes stays documented rather than verified, and now says why: the npm names are a travel-agency search tool and a third-party bridge, not the product. pi has no lifecycle hook surface, and Kiro CLI is not the Kiro IDE; both are recorded where their rows are.
1.0.11
- Every host-specific folder is now named from the general package. SKILL and REFERENCE carry a short table
pointing at
hooks/(Claude Code, Codex),goose/,openclaw/andtools/ambient.mjs, so an agent can find the optional extras for its own host instead of having to be told they exist. Codex's hooks were documented here as absent: they are not. A plugin may bundlehooks/hooks.json, the same file Claude reads, withSessionStartandSessionEndamong its events - so one file now serves both, and the pair is complete (ambient at the start, session filing at the end).
1.0.10
- The Claude Code plugin now carries a SessionStart hook: a small Node script that reads a credential if this machine has one and prints the shelf's context before the model answers, so a session starts oriented instead of asking. With no credential it prints nothing, which is the normal case on an OAuth-connected host, and it never exits non-zero, so a network problem can only mean a quieter session. Plugin hooks ship in hooks/hooks.json; the plugin version has to change for a client to re-cache them.
1.0.9
- The consent page now answers the question OAuth leaves open. OAuth covers the host and leaves no key to copy, so after approving, the page says what covers the CLI, a hook or another machine, and links to where an agent key is made.
centricmem oauth clients(operator, read-only) lists the OAuth registrations and marks which callbacks are already allowed. "Which host still needs allowing" is now a command rather than a support email, and it says a guest machine is not the librarian host instead of printing an empty table.npm run sync:origincompares the API host's static pages by checksum and copies only what drifted. Its first run found three pages out of date; its second was a no-op. The nginx template in that folder is deliberately excluded, because the live snippet carries its own additions.
1.0.8
- The health score stops reading a review queue as sickness: same-topic decisions are still listed, but their penalty is capped, so a shelf with pairs to review reads healthy instead of zero (0220's point, now agreed by the score).
- Line endings are declared in
.gitattributesand the file git had silently marked binary is now pure LF: a one-line edit produces a one-line diff again. npm run bump -- x.y.zperforms the version map AND rebuilds before running the gates - forgetting that step is what broke the 1.0.7 test run.- Housekeeping: the shelf's active_context was about 40 days stale and is refreshed; the origin's dist backups went from 23 to the 3 newest (32 MB to 4 MB); the two dead centricmem-pending directories and the leaked test-fixture api.json are gone.
1.0.7
- The public Skill is MIT from 1.0.7: commercial use allowed, copyright notice kept. It was PolyForm Noncommercial through 1.0.6 and that grant is not withdrawn retroactively. The CentricMem name and the hosted librarian are not part of the grant.
- Host-specific operational detail is served on request (
cm_ops, 15.3 KB) rather than shipped in every copy; the canonical MCP object is written once instead of four times. - New-IP notices name the calling agent (registered OAuth client first, then the writer header), and the operator log carries it too.
- A dead MCP session is named as such - probe, re-handshake, retry - instead of looking like a bad key; unreachable memory says so and never falls back to a local hub.
- The verb gate now compares the app routes, the origin snippet and the MCP gateway table, which is how
cm_opswas caught answering "Unknown librarian path".
1.0.6
- A dead MCP session is now named as such (probe, re-handshake, retry) instead of being mistaken for a bad key, and unreachable memory has an explicit contract: say so, keep working, never fabricate.
- Host-specific install, refresh and failure detail is served on request (cm_ops) rather than shipped in the public copy. The canonical MCP object is written once instead of four times.
- The ambient refresh stops at the librarian instead of falling back to the local hub, where a stale reading could arrive labelled healthy.
- The Skill title no longer carries a version number (it had drifted three releases behind the metadata).
1.0.5
- guest HTTP: the shelf travels as
?library=on reads (a guestsearch -preturned every shelf before), and a host with no key is told so instead of being told the librarian is unreachable. GET /distill: a guest can read distill suggestions over HTTP; rewriting AGENTS.md Global Rules still needs the host.- OAuth: a callback mismatch is now actionable and logged, loopback paths get the slack hosts need (trailing slash, one extra segment), and the consent page offers the device flow when a request is rejected.
- Redaction: the auth-scheme rule requires a 20+ character value, so it stops eating the word after "Bearer" in prose.
- Gates:
npm run check:verbsproves every verb in VERB_ROUTES has a public nginx location (or a declared host-only reason), checked against docs/origin/; both it and the guest POST shelf contract run innpm test. centricmem status --jsonprints the guest / workspace / project status as JSON.
1.0.4
- Skill 1.0.4 / CLI 1.0.4 (one number). No Skill body change: the fixes are on the CLI and the librarian, not in how an agent files. Guest HTTP now resolves the key in the order the Skill already documents (env -> claimed
mcp.json-> catalog/api.json),-p/--libraryactually scopes guest reads, and the credential redactor no longer eats the word after the auth scheme. - The librarian ships the matching read path:
GET /distill, so a guest can read the distill suggestions its ambient recommends (centricmem promote --from-distill) instead of being told to run a host-only command. RewritingAGENTS.mdstill belongs to the host that owns the file.
1.0.3
- Skill 1.0.3 / CLI 1.0.3 (one number). The Skill body now says what the API actually writes:
cm_importitems=adds cards underimported/kept/, whilecm_importbundle: {version: 1, ...}is the full ImportBundle and also writes library files -context->active_context.md(the shelf current focus),rules->AGENTS.mdGlobal Rules - plusdecisions/lessons/sessions/imported/research. A key that can open a shelf can write those; it was never host-only. - The CLI ships the matching hardening: an unknown top-level bundle slot is a
400 BAD_IMPORT_BUNDLEnaming the slot and the allowed list, instead of being dropped silently.
1.0.2
- Skill 1.0.2 / CLI 1.0.2 (one number again). No Skill body change: the CLI shipped the guest-read crash fix, a shared
fetchWithDeadline, a cleannpm auditand the DSH pin bump; REFERENCE.md no longer names a side-copy path nothing writes.
1.0.1
-
One number again: Skill 1.0.1 / CLI 1.0.1. No Skill body change; the CLI shipped two fixes (see the CLI CHANGELOG). The Skill is renumbered because the Skill and the CLI carry one number per release.
-
One number for the Skill and the CLI. From here on the Skill and the CLI ship the same version, and this repo is the truth source for it (
install.jsonskill/cli,package.json, the SKILL.md frontmatter, and the plugin manifests all say1.0.0). This is package bookkeeping only - it is not a statement about hosted-service availability. -
Credential handling (folded in from 0.21.93): never echo a key value. Confirm a key with a fingerprint (
9352... len=64 fp=5E4ED29C), never by dumpingmcp.json/config.toml/*.envwhole, and never redact by length threshold (short keys slip through). If a key reaches the transcript, say so in that turn and rotate it. -
New-network notice (CLI 1.0.0): a key used from a network we have not recorded for it emails its owner once - source IP, coarse edge location from our edge provider, and the client name the caller reported, never the key. IPv4 groups by
/24, IPv6 by/64, at most 5 notices per key per hour, andCENTRICMEM_IP_ALERT=offdisables them. A shared shelf key notifies the shelf owner.
1.0.0
0.21.93
- Credential handling hardened (agent side): never echo a key value. Confirm a key with a fingerprint (
9352... len=64 fp=5E4ED29C), never by dumpingmcp.json/config.toml/*.env, and never by redacting on a length threshold - short keys slip through it. Adds fingerprint idioms and blast-radius + rotation steps. Librarian CLI unchanged (0.21.80).
0.21.92
- Install copy clarifies names:
centricmem= product/CLI;centricmem-skill= this GitHub package;centricmem-agent= Agent Skill folder (--skill/ path). Not a rename. Librarian CLI unchanged (0.21.80).
0.21.91
- Skill refresh: install morphologies (hub body / junction reuse / parallel body). Hosts outside that list must discover and remember this client�s load path and refresh only that tree � do not invent a shared hub or unify sibling copies. Librarian CLI unchanged (0.21.80).
0.21.90
- Findability: SKILL.md opens with a five-line Do not summary. After a disk refresh, re-read SKILL + Do not before the next write. �2 and Skill refresh stress load path ? refresh path; optional inventory for sibling copies; the host's install tool often fails a rename while the host is running � file-level overwrite still works, then sync plugin-packages.json. cm_search takes q (not query). Librarian CLI unchanged (0.21.80).
0.21.89
- Skill refresh: description asks agents to compare the loaded copy vs skill_latest on session start. Plugin-tree hosts prefer the host's install_source tool with the full URL https://github.com/zeyu-j/centricmem-skill (kind plugin; dry-run then apply); read version from the plugin package.json, not ~/.agents. Limits: detect, install, ask human to restart � this chat keeps the already-loaded Skill. Librarian CLI unchanged (0.21.80).
0.21.88
- Optional host hooks are documented as weakly coupled to the Skill: baseline remains Skill section 4 + cm_*. Agents without hooks still file normally. REFERENCE covers L1-L3 roles; guest leftover-hub log-session hooks stay unsupported. On a host whose Stop event is observation-only, session auto-file needs an optional script, not a Stop continue. Librarian CLI unchanged (0.21.80).
0.21.87
- MCP JSON responses include
charset=utf-8.cm_importstampslogged_byfrom the request writer whenimported[].agentis omitted; identical re-imports reportunchanged(notupdated).workSiblingsis always a number (collapsed matches in this result set; not total cards for the work). Doctor shows CLI token source. Direct/mcpscripts must send a non-emptyUser-Agent(else Cloudflare 403). Librarian >=0.21.80.
0.21.86
- Import dry-run/apply share created/updated counts; same
rel_pathwithoutexternal_idis updated;files[]lists actions.imported[].agentstampslogged_by(default migration).cm_showremaps barerel_pathtoimported/.... Guest CLIimport/indexuse librarian HTTP when a Bearer is set. Librarian >=0.21.79.
0.21.85
- MCP opts for ACP agents: prefer
cm_ambientwithshelf=first (cm_healthonly when tools missing / connect / ambient unhealthy). Browse lists default to 50. Librarian >=0.21.78 (ambient Conflicts capped; short MCPcontent+ fullstructuredContent; lean search rows; shorter write-tool descriptions).
0.21.84
- Import shapes hard-warn: top-level
items=creates dailyimported/kept/; upsert corpus paths needbundle.version:1+imported[].rel_path. Hosted shelf is not a local junction; import thencm_index. Librarian CLI unchanged (0.21.77).
0.21.83
- Bearer table:
%LOCALAPPDATA%\centricmem\centricmem.mcp.json+ redact rule; Search and show:cm_show+heading=(first match); omitq+shelf=lists cards; a plugin refresh replaces the whole package metadata. Librarian CLI unchanged (0.21.76).
0.21.82
- Skill refresh: update the copy this host loads.
npx skills add -gwrites~/.agentsand does not update a host's own plugin tree.cm_ambientwithshelf=shapes Recent/Session. Missingcharteron a library row means unset (fall back to displayName). Librarian CLI unchanged (0.21.76).
0.21.81
- Clarify Bearer layers: docs/plans/git use
${CENTRICMEM_API_KEY}or URL-only;connect --claimmay write plaintext Bearer to private local MCP files; hostsends auth headershigh-risk is about apply/probe, not a ban on claim. Librarian CLI unchanged (0.21.76).
0.21.80
- Reach clarifies remote/cloud is not paste-key-only: OAuth when this agent receives the browser login; Bearer only when it cannot; sandbox claim EPERM ??? human claim outside / OAuth / paste in settings. Librarian CLI unchanged (0.21.76).
0.21.79
- Extra agent keys may be View only (
mode: read): search/show/list only; writes return 403. Mint or change on Keys /account key --mode.cm_health/cm_ambientsurfacemode. Default*andshare:unchanged. Librarian >=0.21.76.
0.21.78
- Plugin
mcp.jsonclienttypeishttp(Agent Plugins; wire remains streamable HTTP). Add another Agent Plugins client manifest that points at./mcp.json. REFERENCE: Writes table documentssupersedesand Edit a card (delete + rewrite; no in-place edit). Skill refresh has a no Node path; connect mint failure prefers POST/connect/devicebeforedoctor connectwhen CLI is missing.cm_healthskill_installmentions the no-Node alternative. Librarian CLI unchanged (0.21.75).
0.21.77
- Card writing style is the human + this agent ???????? CentricMem only requires summary + key points (structure). Different agents on the same shelf write differently on purpose. Librarian CLI unchanged (0.21.75).
0.21.76
- Per-shelf charter is live on the librarian:
cm_librarylist/mint,cm_ambientlibrariesrows, Keys + Library desk. Routing #0180 matches charter (fallback displayName). Max 280 characters; empty clears. Librarian >=0.21.75.
0.21.75
- Define chunk (accepted unit this reply) and yield (any reply end). Resume after context compress / checkpoint / new chat = new session:
cm_health????????cm_ambientfirst. Single-source ???4 sweep + gate (Non-Micro + zerocm_*+ no Don't log ???????? sweep before yield). Adaptive vs wrap-up table. Slim SKILL; connect recipes stay in REFERENCE. CLI unchanged (0.21.74).
0.21.74
- Audit follow-up: browse-by-card / per-section writers, MCP 25MB keep binary, supersedes validation, drop legacy
centricmem-mcp, MCP sessions re-check revoked keys. Librarian >=0.21.74. Skill-facing notes for centricmem-skill. This repo is how to use the hosted librarian.
0.21.73
-
Shelf routing (#0180): user explicit ???????? charter/displayName match ???????? path tiebreak only ???????? mint with human-supplied name. Cite the matched line before write. Per-shelf charter shipped in Skill 0.21.76 / librarian >=0.21.75.
-
Unknown Agent Skills hosts: copy
skills/centricmem-agent/to<skills-root>/centricmem-agent/SKILL.md. Aftercentricmem connect --device --url-only, finish withconnect --claim --target <that-host-config.json>(orCENTRICMEM_MCP_TARGETS). Confirm withconnect --verify.doctor connectprints a paste-ready block for zeyu@poppyg.com (never a key). Repo-rootinstall.jsonis the machine-readable recipe. Do not scrape another client'smcp.jsonfor a Bearer. -
Skill frontmatter
descriptionis trigger-only. Wording is "this agent (and each client you install into)".
0.21.72
- DSH:
dsh/cordis.patch.ymlsetsfailOnStartupError: trueso a missing Bearer aborts boot instead of registering 0 tools.dsh/copy-skill.mjscopies this Skill into$DSH_HOME/skills/(DSH never scansnode_modules). Pingithub:zeyu-j/centricmem-skill#v0.21.72. Needspnpmon PATH (npm i -g pnpmif missing). Overlay Bearer on the same MCPidand restate the whole config, then a new chat. Tools appear asmcp__centricmem__cm_*. Skipcm_keep???????? DSH has no plaintext transcript. Nevernpx skills add -gin DSH.
0.21.71
- After Approve, ChatGPT / Codex still waiting ???????? they click Open the agent callback. Sign-in is not the grant; they pick which existing agent key (or mint a new extra) then Approve. Librarian >=0.21.56.
- ChatGPT Apps directory Skill is a Scan Tools snapshot of this folder from host MCP (
skills/list), not a live GitHub pull. After a Skill bump: origin librarian >=0.21.59, then Scan Tools, then a new plugin version. Do notnpx skills addinside ChatGPT to refresh the listed plugin. - ChatGPT directory starter prompts (at most three, no
@mention) are served from host MCPprompts/liston librarian >=0.21.61. If the portal Prompts tab stays empty after Scan Tools, paste those three lines; ChatGPT adds the plugin mention when it displays them.
0.21.70
- HTTPS OAuth callback not on the static allowlist: they request it at https://centricmem.com/oauth/callbacks (proof file or operator review). Librarian >=0.21.55.
0.21.69
- Codex / ChatGPT Mixed is not ???????OAuth plus paste a key??????. Mixed tries unauthenticated
initialize/tools/list; we 401 that. Pick OAuth for the browser, or Bearer inhttp_headersinstead of OAuth.
0.21.68
- Every agent tries
/connect?device=first. If minting that URL fails, they email zeyu@poppyg.com with the error (never a key); then MCP OAuth only if this agent will receive the browser login (Grok Bot / Manus may). A Loopback127.0.0.1callback does not count when this agent is not listening there. - Librarian >=0.21.51. CLI >=0.21.50.
0.21.67
- First connect is signup +
/connect?device=this turn. Already added is only a Bearer or a finished OAuth login in this agent ???????? URL-only plugin /mcp addis first connect. Do not skip the device URL becausemcp loginexists. Loopback127.0.0.1does not authenticate a cloud or remote agent. - Librarian >=0.21.51. CLI >=0.21.50.
0.21.66
- Codex MCP login: librarian accepts
/callback/<id>(Codex CallbackSpecific). Approve hops through same-origin/oauth/continuethen 302s to127.0.0.1. If Codex is still waiting, click Open the agent callback. Do not re-add the MCP URL with no Bearer. - Librarian >=0.21.51. CLI >=0.21.50.
0.21.65
- Daily cards:
cm_import{items}(abundlethat is{items:[...]}with noversionis the same path). ImportBundle is{version:1, lessons?, imported?, ???????}???????? junk shapes name that contract.skipExistingskips a dest slug instead ofslug-2.md. cm_log_decisionrefs:1,0001,#0001, or a comma list. Junk is 400.- Copy asides
imported/kept/from-*stay out of FTS (cm_showby path still works). Keep stubs ?????????? on collision.limitcaps browse and tags-only. Omitcm_libraryidto list shelves.cm_indexreportsskipped.cm_movefiles=is whole Markdown paths only; companion keep stubs and- **Shelf**:follow the card. - Librarian >=0.21.50. CLI >=0.21.50.
0.21.64
- Codex still waiting after Approve: click Open the agent callback on the authorize page (the browser may block the jump to
127.0.0.1). Do not re-add the MCP URL with no Bearer. Librarian >=0.21.49. - CLI >=0.21.48.
0.21.63
cm_delete{file, shelf, heading}removes one##section inlessons.md(notes stay sections, not one file per card). Do not passfile#heading. Same-titlecm_noteis an error ???????? pick a new title, or delete that heading then rewrite. ImportdryRunfiles[].fileis the disk path apply will write.- CLI >=0.21.48.
0.21.62
- If they already added a key or MCP URL in this agent,
cm_*missing means a new chat ???????? do not mint/connect?device=and do not tell them to add the URL with no Bearer (that drops the key). Ignore leftovercentricmemon PATH whenconnect --deviceis missing (npm 0.14.x). First connect is unchanged. - CLI >=0.21.36.
0.21.61
- If connect still fails after signup +
/connect?device=/ OAuth, or they have a usage problem the Skill cannot fix: tell them to email zeyu@poppyg.com (which agent + what they saw; never a key or token). Do not send that mail for them. Website legal/privacy mail stays poppy@poppyg.com. - CLI >=0.21.36.
0.21.60
- Hermes:
hermes skills install zeyu-j/centricmem-skill/skills/centricmem-agent, then preferhermes mcp add --url https://mem.centricmem.com/mcp --auth oauth centricmem(auth: oauthin~/.hermes/config.yaml). Bearer headers only when OAuth is unavailable. Still send/connect?device=unlesscm_*work. - Pi:
pi install https://github.com/zeyu-j/centricmem-skill(package.jsonpi.skills). MCP is URL-only in~/.pi/agent/mcp.json???????? not auto-wired. - OpenClaw: install this repo as an Agent Plugins / Claude / Codex / Cursor bundle. Not ClawHub. Do not add
openclaw.plugin.json. - DSH: root
dsh.bundlemountsdsh/cordis.patch.yml(@deepseek-ai/dsh-mcp-client, URL only, MIT glue). Skill stays PolyForm. Overlay Bearer in the profile patch after/connect?device=. GitHub topicdsh-plugin. - CLI >=0.21.36 (guest
setup --install-skillon CLI >=0.21.46 also copies Claude and Pi skill homes).
0.21.59
- SKILL.md is the handover: When to Use plus three Typical Workflows (first connect, daily cite-and-file, empty shelf). REFERENCE holds client connect branches.
- Official 1Password Environments MCP never returns secret values. It cannot replace
/connect?device=or OAuth, and must not reveal the agent key into chat. The human may store the Keys backup in a vault; the agent never reads it back. - MCP aggregators, HashiCorp Vault, and AWS Secrets Manager are the same class: a customer who already has them may inject an extra key in their worker. They do not replace OAuth or
/connect?device=. - CLI >=0.21.36.
0.21.58
- Agents rename a card title with
cm_rename{file, shelf, title}(optionalheading=when the file has several##sections). File path stays. Decision numbers stay. Default key or login. Extra keys cannot. Shared shelves cannot. Humans can also rename on the Library desk. - CLI >=0.21.36.
0.21.57
- Agents delete a single card with
cm_delete{file, shelf}(library= also works). Always pass the shelf. Default key or login. Extra keys cannot. Shared shelves cannot. Leftover shelf delete stays{id}. - After plugin install, if
cm_*are missing the same reply must still send https://centricmem.com/login?signup=1 and a/connect?device=URL. Pluginmcp.jsonis not a completed connect. OAuth is additive. - CLI >=0.21.36.
0.21.56
- After plugin install, if
cm_*are missing the same reply must send https://centricmem.com/login?signup=1 and a/connect?device=URL. Pluginmcp.jsonis URL-only ???????? it is not a completed connect. - WorkBuddy/CodeBuddy mint that connect URL this turn. Codex:
codex mcp addthencodex mcp loginis additive; still send the connect URL unless tools already work. - Never call librarian HTTP from the shell. Do not put
curlbefore anhttps://URL on the same SKILL.md line. - CLI >=0.21.36.
0.21.55
- Host MCP is
https://mem.centricmem.com/mcponly. Do not install or document a local connector. - CLI >=0.21.36.
0.21.54
- Codex first path is
codex mcp add centricmem --url https://mem.centricmem.com/mcpthencodex mcp login centricmem(or the pluginmcp.json, same URL). Do not put a Bearer in~/.codex/config.tomlwhen OAuth works. - Do not download or hand an agent a settings file that contains a key. A URL-only
mcp.jsonor Codex toml may be copied or opened. - Cursor may still use Add to Cursor on https://centricmem.com (URL only). Paste-key and
/connect?device=stay for hosts that cannot complete OAuth. - CLI >=0.21.36.
0.21.53
- Cursor may use Add to Cursor on https://centricmem.com (URL only, no Bearer in the deeplink) then finish the browser prompt. Prefer
mcp.jsonwithhttps://mem.centricmem.com/mcpand noAuthorization. Paste-key and/connect?device=stay for hosts that cannot complete OAuth. - Do not curl OAuth endpoints.
- CLI >=0.21.36.
0.21.52
- If this client can complete MCP OAuth, add
https://mem.centricmem.com/mcpwith no Bearer and finish the browser prompt. Do not curl OAuth or librarian HTTP. Hermes, Grok, and the CLI still use/connect?device=or paste-Bearer. - After Skill install, the same reply must still send https://centricmem.com/login?signup=1 and tell them to save a backup of the key ???????? Keys shows it only once; never paste it in chat.
- CLI >=0.21.36.
0.21.51
- After Skill install, the same reply must send https://centricmem.com/login?signup=1 and a
/connect?device=URL, and tell them to save a backup of the key ???????? Keys shows it only once; never paste it in chat. - CLI >=0.21.36.
0.21.50
- After Skill install, the same reply must send https://centricmem.com/login?signup=1 and a
/connect?device=URL. Agents with a shell (Hermes) POSThttps://mem.centricmem.com/connect/deviceto mint that session; keep the secret off chat; claim and write Bearer to this agent????????s MCP (~/.hermes/config.yaml). Signup-only stays for blocked shells (Grok).connect --devicestays whencentricmemis on PATH. - CLI >=0.21.36.
0.21.49
- After Skill install, the same reply must send https://centricmem.com/login?signup=1 unless
cm_healthalready works. A working terminal is not the CentricMem CLI ????????connect --deviceonly whencentricmemis on PATH. Hermes:~/.hermes/skills/and Bearer in~/.hermes/config.yaml. - CLI >=0.21.36.
0.21.48
- Login uniquely owns card delete, billing, rotating the default key, and deleting the account (Billing). Never call account delete from MCP.
- Named shelves: Lite/Education 1, Pro 10, Ultra 50, Lifetime 1 20, Lifetime 2 100. Extra keys are uncapped.
- CLI >=0.21.36.
0.21.47
- Lifetime 1 sits between Pro and Ultra (2GB / 20 named shelves). Lifetime 2 is above Ultra (20GB / 100). Not Pro/Ultra pay-once. List is about five years of yearly.
- CLI >=0.21.36.
0.21.46
- Lifetime 1 is Pro, pay once (2GB / 20 named shelves). Lifetime 2 is Ultra, pay once (20GB / 100 named shelves). List is about five years of yearly.
- CLI >=0.21.36.
0.21.45
- Every card needs a summary (
title, andcm_donesummary=) and key points in the body. Title-only / keep stub / empty headings is not a card. - CLI >=0.21.36.
0.21.44
- A titled keep stub is not filing. Keep the original, then
cm_notewhose body is the key points later agentscm_show(writing style, SOP, literature). Attachments are not searchable; do not load them. - CLI >=0.21.36.
0.21.43
- The agent files. One or a few originals:
cm_keepthencm_note. A folder:cm_keep{card:false}then onecm_import{items}. Do not send a zip through MCP. Archive Upload zip only if you already packed a zip or the agent cannot read the files. - Ignore host
cm_doctorsaying the Skill is outdated ???????? that is the librarian disk. Compare this file toskill_latest/ GitHub. - CLI >=0.21.36.
0.21.42
- Bulk ingest: stage cards and originals locally, then one librarian commit. Caps: 50 cards, 50 attachments, 32MB zip, 80MB uncompressed, 25MB per file (
cm_healthpackage). Agent:cm_keep{card:false}then onecm_import{items}withattachpointers. Do not send a zip through MCP. Humans upload the zip on Archive; each card names its shelf (Shelf:or a Tags token that is the shelf id). - CLI >=0.21.36.
0.21.41
libraries=may listshare:<accountId>:<slug>when someone shared a named shelf with this email. Pass that id asshelf=exactly. Do not mintshare:. Login and the default key (*) see invited shelves; extra keys do not. Copy onto a shelf you own; do not delete or move a shared shelf.- Attachments and named shelves: Lifetime 1 is 2GB / 20 shelves; Lifetime 2 is 50GB / 1000. Monthly extra-shelf caps are unchanged. Extra keys stay uncapped.
0.21.40
cm_move{from,to,files}relocates selected Markdown cards onto another named shelf. Source files are deleted. Decision numbers stay if free on dest, otherwise a new seq. Attachments re-attach on dest. Default key or owner login; extra keys cannot. Pick cards withcm_search/cm_show. Do not download originals to ???????move?????? them.cm_copystill copies a whole leftover shelf; card delete stays login-only.
0.21.39
- Hosted ambient/doctor: unmatched cwd or omitted
shelf=islibrary=(none)pluslibraries=???????? not the hubusepin. Pick a named shelf this turn (or mint). Extra keys with exactly one grant still open that shelf. Guests do not--link. - After first
cm_healththis chat, say once which key (*= default / every shelf, else list extra grants). Suggest Keys grant ticks or minting an extra for another agent; authenticate default if this extra is too narrow. Never paste keys; never change grants via MCP. - Unmatched cwd is not a shelf. If ambient is
library=(none), pick fromlibraries=or mint. Do not use the hubusepin.
0.21.38
- CodeBuddy / WorkBuddy:
.codebuddy-plugin/marketplace.json(and.workbuddy-plugin/alias). Add withcodebuddy plugin marketplace add zeyu-j/centricmem-skill. - Kimi Code:
.kimi-plugin/plugin.jsonplus a Custom catalog. Install with/plugins install https://github.com/zeyu-j/centricmem-skill. Host MCP Bearer isCENTRICMEM_API_KEY(never in chat). Official/Curated listing is a Moonshot PR ???????? not a self-serve form.
0.21.37
- If the shell is blocked or
centricmemis missing, do not retry CLI. Send https://centricmem.com/login?signup=1; the human addshttps://mem.centricmem.com/mcpin this agent????????s MCP settings (key from Keys, never in chat).connect --devicestays the path when CLI works. - Empty shelf: offer once to file existing durable memories as cards (capture stays; they may skip).
- Website copy prompt is one line.
0.21.35
- After
/connect?device=writes cloud MCP, retry librarian tools in this chat. A new chat only if they still 401.
0.21.34
- A better shelf label (rebrand, leftover folder slug) is renamed this turn: default key
cm_library{id, displayName}. The id stays. Extra keys cannot. Do not invent a prettier name. Humans can still rename on the Library desk.
0.21.33
- Guest
setup --install-skillcopies Skill files only (CLI >=0.21.25). It must not rewrite Host MCP from leftover catalog. If tools 401 after an older CLI did that, authenticate with a new/connect?device=link, then a new chat. - One GitHub repo is the install surface for every Agent Skills / Agent Plugins client: Cursor (
.cursor-plugin/marketplace.json), Claude Code (.claude-plugin/marketplace.json), Codex (.agents/plugins/marketplace.json), Copilot CLI, Kiro Powers (.kiro/plugins/marketplace.json), plusnpx skills addfor SKILL.md. Sweep, refresh, and deferred hold are agent-neutral.
0.21.32
- Humans rename a shelf label and browse every card on the Library desk. The shelf id stays (
shelf=/ folder / grants). Default key:cm_library{id, displayName}on an existing shelf updates that label.cm_searchwithoutqand withshelf=lists cards (one per file). - Marketplace packaging: SkillKit well-known at
https://centricmem.com/.well-known/skills/; HOL Plugin Scanner CI on this repo; Agent Plugins keywords includeagent-plugins/agent-skills. The Agent Plugins directory already listscentricmem-skill.
0.21.31
- Librarian down or token failed: still compose the sweep and hold it (
CentricMem deferred sweep+ transcript path). File the hold whencm_healthsucceeds. Only skip if the human said don't log or they stopped using this Skill.
0.21.30
- There is no Inbox. Named shelves only. Writes without
shelf=/library=/ a cwd-link are 400LIBRARY_REQUIRED. Leftoverunclassifiedon an old hub:cm_copy{from:unclassified,to:<named>}thencm_delete. Never copy to Inbox. Droppedcm_inbox/cm_classify. - Leftover shelf removal is delete, not archive:
cm_copy{from,to}thencm_delete{id}. There is no restore warehouse. The website Archive desk is the live card catalog. Extra keys may copy if both grants; only default/login may delete a leftover shelf. Card delete stays login-only.
0.21.29
- Organize leftover named shelves on the librarian: dest must exist (
cm_libraryif needed).cm_copy{from,to}copies cards and attach originals (identical skip; collisionsimported/kept/from-<id>/). Thencm_archive{id}. Never download originals to this computer. Extra keys may copy if both grants; only default/login may archive. Card delete stays login-only.
0.21.28
- If a key was pasted into a chat, the owner signs in and rotates it on Keys. The old secret dies. Agents never ask for the new one in chat.
0.21.27
- Refresh compares
metadata.version(not a top-levelversionkey). The installed Skill path is agent-neutral.
0.21.26
- Extra keys: authenticate so the owner enters the default key to mint a shelf. Connect does not create shelves. Inbox drain extras can
apply. - Packaging: Copilot CLI marketplace at
.github/plugin/marketplace.json; Grok Build manifest at.grok-plugin/plugin.json; CodexcomposerIconatassets/icon.svg. Swap that SVG (and the website favicon) when the logo changes.
0.21.25
- One agent-key type. Default (
*= every shelf) is unique and renameable; it cannot be revoked. Extra keys grant one or more shelves and are uncapped. Login uniquely owns delete and billing. Website Billing shows the plan; after the first Stripe customer it opens the Customer Portal.
0.21.24
- MCP/HTTP accept
shelf=<id>as an alias oflibrary=<id>. Account JSON still haslibrariesand alsoshelves.
0.21.23
- Public names: Library (one per person) ???????? Shelf (pairing-key vault) ???????? Card. Agents pass
shelf=<id>orlibrary=<id>. Default account key = every shelf in this library. Pairing key = that shelf. Inbox is a system shelf, never a sweep target. - Sign up is open. Install copy no longer says invite-only.
0.21.22
SKILL.mdfollows the Agent Skills specification:name,description(what + when),license,compatibility, andmetadata(version / CLI floor / changelog).- This repo is also an Agent Plugins 1.0 package (
plugin.json+skills/+mcp.json) for Codex, Copilot, and Kiro. MCP ishttps://mem.centricmem.com/mcpwith no token in git. Codex-native pack:.codex-plugin/plugin.json. - Still one public skill:
centricmem-agent. Install remainsnpx skills add zeyu-j/centricmem-skill --skill centricmem-agent -g.
0.21.21
- Authenticate is always a
/connect?device=link. The agent runscentricmem connect --deviceand sends only that URL. You have ten minutes to enter the key. Sign in at the website for the dashboard ???????? there is no ???????connect this computer?????? button. Never paste a key into chat.
0.21.20
- Remote agents (VPS / Cloud Agent): the agent runs
centricmem connect --deviceand sends only the printed/connect?device=URL. You have ten minutes to enter the key on that page. The secret never appears in chat. Then start a new chat there. - On the computer in front of you, the agent still sends
https://centricmem.com/connect(loopback helper). Never paste a key into chat.
0.21.19
- Login uniquely owns delete and billing. The default account key (all libraries) may mint, rename, grant, and revoke other keys ???????? including every pairing key on a library. Pairing keys cannot. New tokens stay off chat (dashboard / CLI, not MCP).
- Attachments are metered per plan (Lite 100MB, Education 200MB, Pro 1GB, Ultra 10GB). Markdown is unlimited. Over quota, keep fails ???????? the agent says so.
0.21.18
- The authenticate link accepts any agent key: default (every library) or a pairing key (that library). Default is one choice, not the only one.
- Not a one-click install. You enter the key on
https://centricmem.com/connect???????? never in chat.
0.21.17
- When a key is needed, the agent sends the authenticate link
https://centricmem.com/connect. You enter the key on that page ???????? never in chat. Not a one-click install. The helper on this computer (centricmem connect) writes MCP for every agent. - The owner's agents use the default account key (all libraries). Friend pairing keys stay one vault.
0.21.16
/connectis for every agent: copy the same host MCP snippet (never paste a token in chat). CLIcentricmem connectwrites MCP configs it finds on this computer. Optional Cursor one-click is not the product.- The owner's agents use the default account key (all libraries). Friend pairing keys stay one vault.
0.21.15
- Paste an agent key on this computer at
https://centricmem.com/connect(Cursor opens an install prompt). Never paste a token in chat. CLI:centricmem connectwrites~/.cursor/mcp.jsonfrom a local page. - Owner Cursor still uses the default account key (all libraries). Friend pairing keys stay one vault.
0.21.14
- Sweep never writes Inbox (
unclassified). Pick a named library, or mint one (cm_library) when none fits. Drain leftovers with classify ???????? do not leave them for the human. Pairing keys still cannot mint a library. - The owner's agent uses the default account key (all libraries). Friend pairing keys stay one vault.
- Still no curl. Originals and key minting stay on the dashboard.
0.21.13
- One MCP Bearer can be an account key: the owner grants which libraries it may open (
library=/cwd=). Friend-style pairing keys stay one library. Isolation is one key = its grants. - Still no curl. Originals and key minting stay on the dashboard. Login session is not for agents.
0.21.12
- Agents use the hosted MCP URL
https://mem.centricmem.com/mcpwith the appropriate agent credential. - Same
cm_*tools. Still no curl. Originals stay on the dashboard.
0.21.11
- The agent talks to the librarian only through host MCP (
cm_health,cm_search,cm_keep, ???????). It does not curl. Originals stay on the dashboard. - After
centricmem setup --install-skill, Cursor MCP is merged on this machine. A new chat picks up the tools.
0.21.10
- The hosted MCP exposes the same librarian verbs as this Skill, including import, classify, and index. Originals, delete, and account stay on the dashboard.
0.21.9
- The agent files when the work is real ???????? you do not have to say wrap up. Closing the tab does not file; it files before it stops.
- If this Skill is behind GitHub, the agent runs
npx skills addonce. This chat still uses the loaded copy; the next chat uses the new one.
0.21.8
- Hosted
/ambientis not your Skill version. If this file is old, re-runnpx skills add zeyu-j/centricmem-skill --skill centricmem-agent -g. - This GitHub repo ships the Skill only (install + how to use).
0.21.7
- At close, the agent keeps this chat????????s transcript in object storage, then files units. You download originals from the dashboard.
0.21.4
- Capture stays in the agent you already use. CentricMem organises and retrieves on the hosted librarian.