Memoir
Memory server
First committed by zhangfengcdt
Published in zhangfengcdt/memoir. Publisher page
629 GitHub stars
What it is
Hierarchical Agent Memory with Git-Like Version Control
AutoGineer overview, from the brain’s own files
Memoir is a memory system designed to replace opaque vector databases with a transparent, versioned, and cryptographically secure storage layer. By utilizing ProllyTrees, it enables hierarchical semantic paths instead of UUIDs, allowing for efficient O(log n) lookups. It addresses common AI memory issues like context contamination and token waste by providing branch, commit, merge, and rollback capabilities. Memoir integrates with various agents through plugins and an MCP server, supporting both keyword-based and LLM-powered semantic search.
How it works
Memory model: Not stated
AutoGineer overview, from the brain’s own files
Memoir organizes memory into a hierarchical structure using semantic paths, such as profile.professional.skills.python. It uses a ProllyTree-based store to manage data, allowing for Git-like operations such as branching and versioning. The system includes a classifier to categorize memories and a search engine for retrieval. It provides a CLI for manual interaction, hooks for automatic memory capture in supported agents, and an MCP server for integration with various AI development tools.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 10 |
| docs | docs | 41 |
| scripts | scripts | 9 |
| src | source-code | 216 |
| tests | tests | 53 |
| .agents | folder | 1 |
| .claude-plugin | folder | 1 |
| benchmarks | folder | 10 |
| packaging | folder | 3 |
| plugins | folder | 187 |
| static | folder | 2 |
The agent writes
- create_if_missing evidence: CLAUDE.md
Requirements
Runtimes: Python >=3.10
API keys (by name): ANTHROPIC_API_KEY, OPENAI_API_KEY
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 7 hooks (claude-code, codex), 2 scripts. Review Makefile, README.md, plugins/claude-code/hooks/hooks.json, plugins/codex/hooks/hooks.json before opening the folder in Claude Code. No step below turns a hook on for you.
Makefile:pip install -e .README.md:curl -LsSf https://astral.sh/uv/install.sh | shplugins/claude-code/hooks/hooks.json:bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.shplugins/claude-code/hooks/hooks.json:bash ${CLAUDE_PLUGIN_ROOT}/hooks/user-prompt-submit.shplugins/claude-code/hooks/hooks.json:bash ${CLAUDE_PLUGIN_ROOT}/hooks/stop.shplugins/claude-code/hooks/hooks.json:bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-end.shplugins/codex/hooks/hooks.json:bash "${PLUGIN_ROOT}/hooks/session-start.sh"plugins/codex/hooks/hooks.json:bash "${PLUGIN_ROOT}/hooks/user-prompt-submit.sh"plugins/codex/hooks/hooks.json:bash "${PLUGIN_ROOT}/hooks/stop.sh"
- Not scanned by AutoGineerThe author’s README also describes installing it as a Claude Code plugin marketplace. Read its install section: AutoGineer did not scan that path. https://github.com/zhangfengcdt/memoir/blob/7fd1b3ef704fc554596571d5b9c8b73d7f2b0c5d/README.md#install-a-plugin-for-your-agent
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (7 declared). https://pypi.org/project/memoir-ai/
First committed by zhangfengcdt. Published in zhangfengcdt/memoir. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- CLI-based memory management
- Automatic context injection for coding agents
- Version-controlled memory branching
- Semantic search across stored facts
- Cross-machine memory synchronization
- “memoir remember "I prefer using Python for data analysis" -p preferences.coding.languages”
- Stores the fact under the specified semantic path for later retrieval.
- “memoir recall "what are my coding preferences?"”
- Performs a semantic search to retrieve the relevant stored memory.
Documentation by zhangfengcdt
Memoir
<div align="center"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://www.memoir-ai.dev/images/memoir.png"> <source media="(prefers-color-scheme: light)" srcset="https://www.memoir-ai.dev/images/memoir-light.png"> <img src="https://www.memoir-ai.dev/images/memoir.png" alt="Memoir Logo" width="200" height="200"> </picture>
Git for AI Memory
Hierarchical Memory with Git-Like Version Control
</div>
Image: Python Image: License Image: Status Image: Website Image: Docs
<p align="center"> <img src="docs/_static/memoir-demo.gif" alt="Memoir demo" width="900"> </p>
Memoir is a high-performance semantic memory system for AI agents that brings Git-like version control to AI memory management. It replaces opaque vector databases with transparent, versioned, cryptographically secure memory storage using hierarchical semantic paths.
Project page: memoir-ai.dev — full overview, demos, and roadmap.
Why agents need versioned memory
AI memory is a Global Variable anti-pattern. Every production agent hits the same three walls: context contamination, token rent, and memory drift. Memoir brings version control to your agent's mind.
Your agent doesn't respect your git state.
Context contamination happens every time you git checkout. Without branch-aware memory, your agent tries to apply experimental refactor patterns to stable production hotfixes.
You're paying "token rent" on a flat file.
Using CLAUDE.md or MEMORY.md as a global store is a cache-killer. Every minor memory update invalidates your entire prefix cache, forcing you to pay full price to re-process your entire conversation.
Your agent's memory is code without version control.
Today's AI memory — CLAUDE.md, vector stores, scratchpads — is treated like an append-only blob. One bad session poisons every future retrieval. Without memoir blame or memoir checkout, there's no way to audit who taught the agent a rule or revert a hallucination without wiping the whole store.
Key Features
Git-like Versioning — Branch, commit, merge, and rollback memories with cryptographic integrity.
Semantic Paths — Replace UUID keys with meaningful paths like
profile.professional.skills.python.O(log n) Lookups — Fast hierarchical search instead of expensive vector operations.
Memory Aggregation — Automatic consolidation of related memories at semantic locations.
Clean Architecture — Proper separation of storage, classification, and search layers.
Multiple Search Engines — Choose between fast keyword-based or intelligent LLM-powered search.
<!-- ## Multi-agent sessions <p align="center"> <img src="docs/_static/memoir-multi-agent.gif" alt="Multiple agent sessions working with Memoir" width="900"> <br> <em>Multiple agent sessions working with Memoir.</em> </p> -->
Install from PyPI
pip install memoir-aiThe distribution name on PyPI is
memoir-ai. The Python import isimport memoirand the CLI ismemoir.
Install a plugin for your agent
Memoir ships as a plugin for several coding and personal-assistant agents. Expand the one you use:
<details> <summary><b>Claude Code</b></summary>
Inside a Claude Code session, run:
/plugin marketplace add zhangfengcdt/memoir
/plugin install memoir@memoirNo manual pip install needed if you have uv on PATH — the plugin auto-resolves to uvx --from memoir-ai memoir when the bare memoir binary isn't installed. Don't have uv? Install it once with the standard one-liner:
curl -LsSf https://astral.sh/uv/install.sh | shThat's enough — the plugin handles the rest. It registers hooks for session start, user-prompt-submit, and stop, so your project gets automatic context injection and auto-captured memories. See the Claude Code plugin guide for the full slash-command and hook reference.
</details>
<details> <summary><b>Codex</b></summary>
Memoir's Codex plugin is distributed from this repository's Codex marketplace. In Codex, run /plugins, add the memoir marketplace from zhangfengcdt/memoir, restart Codex if prompted, then choose Memoir Plugins and install memoir.
You can also register the marketplace from the CLI:
codex plugin marketplace add zhangfengcdt/memoirWhile developing from a local checkout, use codex plugin marketplace add /absolute/path/to/memoir instead. The repo marketplace lives at .agents/plugins/marketplace.json and points Codex at ./plugins/codex, relative to the repository root.
No manual pip install needed if you have uv on PATH — the Codex plugin resolves the Memoir CLI the same way the Claude Code plugin does: memoir on PATH first, then uvx --from memoir-ai==<pinned> memoir, then uv tool run --from memoir-ai==<pinned> memoir.
Enable Codex hooks with [features].hooks = true in ~/.codex/config.toml or pass --enable hooks for a smoke run. The Codex plugin ships lifecycle hooks; memory-recall, memoir-onboard, memoir-remember, memoir-status, and memoir-ui skills; Codex-specific transcript parsing; and local marketplace metadata. See the Codex plugin guide for setup, limitations, and the real Codex smoke-test flow.
</details>
<details> <summary><b>Hermes</b></summary>
Memoir is a memory provider for Hermes, the Nous Research personal-assistant agent. Install the plugin into your Hermes home and activate it:
hermes plugins install zhangfengcdt/memoir/plugins/hermes # or: cp -r plugins/hermes ~/.hermes/plugins/memoir
hermes memory setup # choose "memoir"Hermes then auto-captures durable facts (people, schedule, preferences, standing instructions) each turn and exposes memoir_recall / memoir_remember / memoir_forget / memoir_sync / memoir_status tools. Capture/classification run on your host-selected model via direct provider APIs (never the claude CLI). See the Hermes plugin guide for install, configuration, model selection, and proxy routing.
</details>
<details> <summary><b>OpenClaw</b> (community)</summary>
Memoir is a memory plugin for OpenClaw, the personal-assistant gateway. It lives in its own repo, zhangfengcdt/openclaw-memoir. Install it into the memory slot, allow conversation access, and restart the gateway:
openclaw plugins install https://github.com/zhangfengcdt/openclaw-memoir # or: --link /path/to/openclaw-memoir
openclaw config set plugins.entries.memory-memoir.hooks.allowConversationAccess true
systemctl --user restart openclaw-gatewayOpenClaw then auto-captures durable facts each turn (remembered across your sessions by default) and exposes memoir_recall / memoir_remember / memoir_forget / memoir_status tools plus an in-chat /memoir command. Set a capture model + provider key in config — plugins.entries.memory-memoir.config.{model,apiKey} (OpenClaw keeps its own keys in a secret store; use a temperature=0-capable model like anthropic/claude-haiku-4-5). See the OpenClaw plugin guide for configuration, scoping, model selection, and tool-profile notes.
</details>
<details> <summary><b>OpenCode</b> (community)</summary>
opencode-memoir is a community-maintained plugin that brings Memoir's long-term memory workflows to OpenCode through its native plugin system. Follow the install instructions in that repository.
</details>
<details> <summary><b>Any MCP host</b> (Claude Desktop, Cursor, Cline, Windsurf, VS Code, Zed, …)</summary>
Memoir ships an MCP server (memoir-mcp) on the official Model Context Protocol SDK, so any MCP-compatible host gets git-versioned memory — including the memoir_branches / memoir_checkout / memoir_commits versioning tools no other memory server has. No install needed if you have uv; add to your host's mcpServers config:
{
"mcpServers": {
"memoir": {
"command": "uvx",
"args": ["--from", "memoir-ai[mcp]", "memoir-mcp"],
"env": { "MEMOIR_STORE": "~/.memoir/mcp" }
}
}
}Recall is LLM-free by default (keyless), with opt-in single-call or multi-level tiered LLM modes; the store auto-creates on first use. See the MCP server guide for per-host config (VS Code/Zed/Continue/LibreChat differ slightly), recall modes + LLM setup, remote HTTP for ChatGPT/Claude.ai connectors, and the one-click Claude Desktop .mcpb.
</details>
Quick look
Memoir's CLI defaults to Anthropic claude-haiku-4-5 as of v0.1.6 — set your key first:
export ANTHROPIC_API_KEY="sk-..."Note that if you do not set any model api keys, it will try to use the claude -p command to authenticate via claude code's subscription.
Then create a store and round-trip a memory:
# 1. Create a memoir store
memoir new my-memoir-store
cd my-memoir-store
# 2. Store with an explicit path (offline, no LLM call)
memoir remember "Sarah prefers tabs and 2-space indents" -p preferences.coding.style
# 3. Store with auto-classification (LLM picks the path; needs API key)
memoir remember "I work in Pacific time"
# 4. Read back by path (offline)
memoir get preferences.coding.style
# 5. Semantic search (LLM-backed)
memoir recall "what does Sarah prefer?"
# 6. Watch a file by indexing it on the fly
memoir watch add ~/papers/transformer.pdf -n research
# 7. Search the indexed content
memoir search "transformer attention mechanism"
# 8. Open the visual explorer (auto-opens in your browser)
memoir uiCurious what the UI looks like before installing? Browse the UI Gallery.
Prefer a different model? memoir recall "..." --model gpt-4o-mini (needs OPENAI_API_KEY), or set MEMOIR_LLM_MODEL in your shell. Resolution order: --model flag → MEMOIR_LLM_MODEL → claude-haiku-4-5.
See the full Quickstart for the Python API and version-control workflow.
Documentation
Full docs live at zhangfengcdt.github.io/memoir:
Quickstart — five-minute tour of the core loop.
CLI Reference — every command, flag, and exit code.
UI — the visual explorer (Tree / Graph / Timeline / Places +
/stats).Claude Code — plugin install, slash commands, hooks, lifecycle.
Codex — plugin install, hooks, skills, transcript parsing, smoke-test evidence.
Architecture — taxonomy, classifier, store, search.
API Reference — Python SDK.
Examples — context branching, memory debugging, reproducible testing.
Contributing
Memoir is alpha and contributions are very welcome — especially from people building coding agents, since that's the audience we're optimizing for. Good first paths in:
Pick an issue from the issue tracker or open one describing a gap.
Fork the repo, branch off
main, and runmake cibefore opening a PR (lint, tests, docs build must be green).Bug reports with a minimal reproducer and benchmark / taxonomy proposals for coding-agent use cases are particularly appreciated.
License
Apache License 2.0 — see LICENSE.
LICENSE
Shown as plain text.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
512 files · 489 not served here
- .agents/plugins/marketplace.json (not served here)
- .claude-plugin/marketplace.json (not served here)
- .dockerignore (not served here)
- .github/ISSUE_TEMPLATE/bug_report.md (not served here)
- .github/ISSUE_TEMPLATE/feature_request.md (not served here)
- .github/ISSUE_TEMPLATE/performance_issue.md (not served here)
- .github/pull_request_template.md (not served here)
- .github/workflows/cc-smoke.yml (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/docs.yml (not served here)
- .github/workflows/mcp-release.yml (not served here)
- .github/workflows/pypi-smoke.yml (not served here)
- .github/workflows/release.yml (not served here)
- .gitignore (not served here)
- .pre-commit-config.yaml (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CLAUDE.md
- CONTRIBUTING.md
- LICENSE
- Makefile (not served here)
- README.md
- RELEASING.md
- benchmarks/classifier.py (not served here)
- benchmarks/data/recall_test_queries.json (not served here)
- benchmarks/data/remember_test_data.json (not served here)
- benchmarks/locomo/README.md (not served here)
- benchmarks/locomo/__init__.py (not served here)
- benchmarks/locomo/cognitive.py (not served here)
- benchmarks/locomo/data.py (not served here)
- benchmarks/locomo/judge.py (not served here)
- benchmarks/locomo/memoir_runner.py (not served here)
- benchmarks/locomo/run.py (not served here)
- docker.sh (not served here)
- docs/_static/.gitkeep (not served here)
- docs/_static/custom.css (not served here)
- docs/_static/memoir-demo.gif (not served here)
- docs/_static/memoir-light.png (not served here)
- docs/_static/memoir-multi-agent.gif (not served here)
- docs/_static/memoir.png (not served here)
- docs/_static/ui-graph.png (not served here)
- docs/_static/ui-stats-modal.png (not served here)
- docs/_static/ui-tree.png (not served here)
- docs/api/classifier.md (not served here)
- docs/api/memento.md (not served here)
- docs/api/memoir.md (not served here)
- docs/api/search.md (not served here)
- docs/api/store.md (not served here)
- docs/api/taxonomy.md (not served here)
- docs/architecture.md
- docs/basic_usage.md
- docs/claude_code.md
- docs/cli.md
- docs/cloud.md
- docs/codex.md
- docs/examples.md
- docs/examples/context_branching.md (not served here)
- docs/examples/memory_debugging.md (not served here)
- docs/examples/production_debugging.md (not served here)
- docs/examples/reproducible_testing.md (not served here)
- docs/faq.md
- docs/hermes.md
- docs/index.md
- docs/installation.md
- docs/mcp.md
- docs/openclaw.md
- docs/quickstart.md
- docs/theory/classifier.md (not served here)
- docs/theory/conflict-merge.md (not served here)
- docs/theory/index.md (not served here)
- docs/theory/memento.md (not served here)
- docs/theory/related-work.md (not served here)
- docs/theory/search.md (not served here)
- docs/ui.md
- docs/watch.md
- mkdocs.yml (not served here)
- packaging/mcp/README.md (not served here)
- packaging/mcp/manifest.json (not served here)
- packaging/mcp/server.json (not served here)
- plugins/claude-code/.claude-plugin/plugin.json (not served here)
- plugins/claude-code/.gitignore (not served here)
- plugins/claude-code/README.md (not served here)
- plugins/claude-code/commands/onboard.md (not served here)
- plugins/claude-code/commands/pane.md (not served here)
- plugins/claude-code/commands/push.md (not served here)
- plugins/claude-code/commands/recall.md (not served here)
- plugins/claude-code/commands/remember.md (not served here)
- plugins/claude-code/commands/status.md (not served here)
- plugins/claude-code/commands/sync.md (not served here)
- plugins/claude-code/commands/ui.md (not served here)
- plugins/claude-code/hooks/collect-edits.sh (not served here)
- plugins/claude-code/hooks/collect-metrics.sh (not served here)
- plugins/claude-code/hooks/common.sh (not served here)
- plugins/claude-code/hooks/hooks.json (not served here)
- plugins/claude-code/hooks/merge-metrics.py (not served here)
- plugins/claude-code/hooks/mod/format.ts (not served here)
- plugins/claude-code/hooks/mod/mod.test.tsx (not served here)
- plugins/claude-code/hooks/mod/pane.tsx (not served here)
- plugins/claude-code/hooks/mod/register.tsx (not served here)
- plugins/claude-code/hooks/mod/store.ts (not served here)
- plugins/claude-code/hooks/parse-transcript.sh (not served here)
- plugins/claude-code/hooks/prompts/code_change_summary.tmpl (not served here)
- plugins/claude-code/hooks/prompts/stop_capture.tmpl (not served here)
- plugins/claude-code/hooks/session-end.sh (not served here)
- plugins/claude-code/hooks/session-start.sh (not served here)
- plugins/claude-code/hooks/stop.sh (not served here)
- plugins/claude-code/hooks/user-prompt-submit.sh (not served here)
- plugins/claude-code/scripts/derive-store-path.sh (not served here)
- plugins/claude-code/scripts/ensure-store.sh (not served here)
- plugins/claude-code/scripts/memoir-cli.sh (not served here)
- plugins/claude-code/scripts/memoir-ui-ctl.sh (not served here)
- plugins/claude-code/scripts/pane-cmd.sh (not served here)
- plugins/claude-code/scripts/push-cmd.sh (not served here)
- plugins/claude-code/scripts/resolve-memoir-cli.sh (not served here)
- plugins/claude-code/scripts/status-cmd.sh (not served here)
- plugins/claude-code/scripts/statusline.sh (not served here)
- plugins/claude-code/scripts/sync-cmd.sh (not served here)
- plugins/claude-code/skills/memoir-onboard/SKILL.md (not served here)
- plugins/claude-code/skills/memoir-onboard/extractors.py (not served here)
- plugins/claude-code/skills/memory-recall/SKILL.md (not served here)
- plugins/claude-code/tests/prompt-harness/README.md (not served here)
- plugins/claude-code/tests/prompt-harness/assertions.py (not served here)
- plugins/claude-code/tests/prompt-harness/cases/code_change_summary/doc-only-change.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/code_change_summary/multiedit-refactor.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/code_change_summary/single-edit-rename.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/code_change_summary/whitespace-only-trivial.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/code_change_summary/write-new-test-file.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/acknowledgment-does-not-fire.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/addendum-not-add-does-not-fire.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/case-insensitive-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/code-fence-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/file-path-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/no-memories-does-not-fire.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/noun-memoir-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/noun-recall-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/question-shape-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/short-prompt-does-not-fire.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/verb-add-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/verb-investigate-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/gate/user-prompt-submit/verb-make-fires.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/recall_ab/casual-greeting.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/recall_ab/design-decision.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/recall_ab/refactor-task.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-architectural-decision.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-cross-namespace.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-from-now-on-tool-pref.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-going-forward-rule.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-multi-fact-turn.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-multi-path.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-project-fact.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/capture-stop-doing-x.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/format-no-segment-hyphens.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/format-noisy-preamble-stripped.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-mixed-rule-vs-action.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-personal-chitchat.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-polite-thanks.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-retraction.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-routine-qa.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/cases/stop_capture/ignore-tool-mechanics.yaml (not served here)
- plugins/claude-code/tests/prompt-harness/gate.py (not served here)
- plugins/claude-code/tests/prompt-harness/prompts.py (not served here)
- plugins/claude-code/tests/prompt-harness/recall_ab.py (not served here)
- plugins/claude-code/tests/prompt-harness/runner.py (not served here)
- plugins/claude-code/tests/test_branch_sync.sh (not served here)
- plugins/claude-code/tests/test_collect_edits.sh (not served here)
- plugins/claude-code/tests/test_collect_metrics.py (not served here)
- plugins/claude-code/tests/test_ensure_store.sh (not served here)
- plugins/claude-code/tests/test_extractors.py (not served here)
- plugins/claude-code/tests/test_no_git_repo.sh (not served here)
- plugins/claude-code/tests/test_push_cmd.sh (not served here)
- plugins/claude-code/tests/test_stop_code_summary.sh (not served here)
- plugins/claude-code/tests/test_stop_metrics.sh (not served here)
- plugins/claude-code/tests/test_store_mode_drift_warning.sh (not served here)
- plugins/claude-code/tests/test_worktree_shared_store.sh (not served here)
- plugins/claude-code/types/index.d.ts (not served here)
- plugins/codex/.codex-plugin/plugin.json (not served here)
- plugins/codex/README.md (not served here)
- plugins/codex/hooks/collect-edits.sh (not served here)
- plugins/codex/hooks/collect-metrics.sh (not served here)
- plugins/codex/hooks/common.sh (not served here)
- plugins/codex/hooks/hooks.json (not served here)
- plugins/codex/hooks/merge-metrics.py (not served here)
- plugins/codex/hooks/parse-transcript.sh (not served here)
- plugins/codex/hooks/prompts/code_change_summary.tmpl (not served here)
- plugins/codex/hooks/prompts/stop_capture.tmpl (not served here)
- plugins/codex/hooks/session-start.sh (not served here)
- plugins/codex/hooks/stop.sh (not served here)
- plugins/codex/hooks/user-prompt-submit.sh (not served here)
- plugins/codex/scripts/derive-store-path.sh (not served here)
- plugins/codex/scripts/ensure-store.sh (not served here)
- plugins/codex/scripts/install-codex-hooks.sh (not served here)
- plugins/codex/scripts/memoir-cli.sh (not served here)
- plugins/codex/scripts/memoir-ui-ctl.sh (not served here)
- plugins/codex/scripts/resolve-memoir-cli.sh (not served here)
- plugins/codex/scripts/status-cmd.sh (not served here)
- plugins/codex/skills/memoir-onboard/SKILL.md (not served here)
- plugins/codex/skills/memoir-onboard/extractors.py (not served here)
- plugins/codex/skills/memoir-remember/SKILL.md (not served here)
- plugins/codex/skills/memoir-status/SKILL.md (not served here)
- plugins/codex/skills/memoir-ui/SKILL.md (not served here)
- plugins/codex/skills/memory-recall/SKILL.md (not served here)
- plugins/codex/tests/prompt-harness/README.md (not served here)
- plugins/codex/tests/prompt-harness/assertions.py (not served here)
- plugins/codex/tests/prompt-harness/cases/code_change_summary/doc-only-change.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/code_change_summary/multiedit-refactor.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/code_change_summary/single-edit-rename.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/code_change_summary/whitespace-only-trivial.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/code_change_summary/write-new-test-file.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/acknowledgment-does-not-fire.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/addendum-not-add-does-not-fire.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/case-insensitive-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/code-fence-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/file-path-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/no-memories-does-not-fire.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/noun-memoir-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/noun-recall-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/question-shape-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/short-prompt-does-not-fire.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/verb-add-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/verb-investigate-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/gate/user-prompt-submit/verb-make-fires.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-architectural-decision.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-cross-namespace.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-from-now-on-tool-pref.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-going-forward-rule.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-multi-fact-turn.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-multi-path.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-project-fact.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/capture-stop-doing-x.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/format-no-segment-hyphens.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/format-noisy-preamble-stripped.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-mixed-rule-vs-action.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-personal-chitchat.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-polite-thanks.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-retraction.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-routine-qa.yaml (not served here)
- plugins/codex/tests/prompt-harness/cases/stop_capture/ignore-tool-mechanics.yaml (not served here)
- plugins/codex/tests/prompt-harness/gate.py (not served here)
- plugins/codex/tests/prompt-harness/prompts.py (not served here)
- plugins/codex/tests/prompt-harness/runner.py (not served here)
- plugins/codex/tests/test_branch_sync.sh (not served here)
- plugins/codex/tests/test_codex_transcript.py (not served here)
- plugins/codex/tests/test_collect_edits.sh (not served here)
- plugins/codex/tests/test_collect_metrics.py (not served here)
- plugins/codex/tests/test_ensure_store.sh (not served here)
- plugins/codex/tests/test_extractors.py (not served here)
- plugins/codex/tests/test_install_codex_hooks.py (not served here)
- plugins/codex/tests/test_no_git_repo.sh (not served here)
- plugins/codex/tests/test_skill_metadata.py (not served here)
- plugins/codex/tests/test_stop_code_summary.sh (not served here)
- plugins/codex/tests/test_stop_metrics.sh (not served here)
- plugins/codex/tests/test_store_mode_drift_warning.sh (not served here)
- plugins/codex/tests/test_worktree_shared_store.sh (not served here)
- plugins/docker-tests/README.md (not served here)
- plugins/docker-tests/claude-code/Dockerfile (not served here)
- plugins/docker-tests/claude-code/test.sh (not served here)
- plugins/docker-tests/codex/Dockerfile (not served here)
- plugins/docker-tests/codex/test.sh (not served here)
- plugins/docker-tests/hermes/Dockerfile (not served here)
- plugins/docker-tests/hermes/README.md (not served here)
- plugins/docker-tests/hermes/test.sh (not served here)
- plugins/hermes/README.md (not served here)
- plugins/hermes/__init__.py (not served here)
- plugins/hermes/bridge.py (not served here)
- plugins/hermes/cli.py (not served here)
- plugins/hermes/plugin.yaml (not served here)
- pyproject.toml (not served here)
- requirements.txt (not served here)
- ruff.toml (not served here)
- scripts/cc-smoke/README.md (not served here)
- scripts/cc-smoke/run.sh (not served here)
- scripts/cc-smoke/smoke.sh (not served here)
- scripts/check_version_consistency.py (not served here)
- scripts/pypi-smoke/Dockerfile (not served here)
- scripts/pypi-smoke/README.md (not served here)
- scripts/pypi-smoke/run.sh (not served here)
- scripts/pypi-smoke/smoke.sh (not served here)
- scripts/stamp_mcp_version.py (not served here)
- src/memoir/__init__.py (not served here)
- src/memoir/classifier/__init__.py (not served here)
- src/memoir/classifier/base.py (not served here)
- src/memoir/classifier/intelligent.py (not served here)
- src/memoir/classifier/semantic.py (not served here)
- src/memoir/cli/__init__.py (not served here)
- src/memoir/cli/commands/__init__.py (not served here)
- src/memoir/cli/commands/analysis.py (not served here)
- src/memoir/cli/commands/branch.py (not served here)
- src/memoir/cli/commands/capture.py (not served here)
- src/memoir/cli/commands/crypto.py (not served here)
- src/memoir/cli/commands/memory.py (not served here)
- src/memoir/cli/commands/search.py (not served here)
- src/memoir/cli/commands/store.py (not served here)
- src/memoir/cli/commands/sync.py (not served here)
- src/memoir/cli/commands/taxonomy.py (not served here)
- src/memoir/cli/commands/tui.py (not served here)
- src/memoir/cli/commands/ui.py (not served here)
- src/memoir/cli/commands/watch.py (not served here)
- src/memoir/cli/main.py (not served here)
- src/memoir/core/__init__.py (not served here)
- src/memoir/core/memory.py (not served here)
- src/memoir/integration/__init__.py (not served here)
- src/memoir/integration/base.py (not served here)
- src/memoir/integration/langgraph/__init__.py (not served here)
- src/memoir/integration/langgraph/memory_store.py (not served here)
- src/memoir/integration/langgraph/types.py (not served here)
- src/memoir/integration/langgraph/utils.py (not served here)
- src/memoir/llm/__init__.py (not served here)
- src/memoir/llm/claude_cli_client.py (not served here)
- src/memoir/llm/litellm_client.py (not served here)
- src/memoir/llm/prompts/capture_assistant.tmpl (not served here)
- src/memoir/llm/prompts/capture_coding.tmpl (not served here)
- src/memoir/llm/prompts/consolidate_read.tmpl (not served here)
- src/memoir/llm/prompts/merge_consolidate.tmpl (not served here)
- src/memoir/mcp/__init__.py (not served here)
- src/memoir/mcp/server.py (not served here)
- src/memoir/memento/__init__.py (not served here)
- src/memoir/memento/location.py (not served here)
- src/memoir/memento/profile.py (not served here)
- src/memoir/memento/timeline.py (not served here)
- src/memoir/sdk/__init__.py (not served here)
- src/memoir/sdk/client.py (not served here)
- src/memoir/search/__init__.py (not served here)
- src/memoir/search/intelligent.py (not served here)
- src/memoir/services/__init__.py (not served here)
- src/memoir/services/agent_account.py (not served here)
- src/memoir/services/base.py (not served here)
- src/memoir/services/branch_service.py (not served here)
- src/memoir/services/cloud_auth.py (not served here)
- src/memoir/services/crypto_service.py (not served here)
- src/memoir/services/memory_service.py (not served here)
- src/memoir/services/merge_policy.py (not served here)
- src/memoir/services/models.py (not served here)
- src/memoir/services/repo_meta.py (not served here)
- src/memoir/services/search_service.py (not served here)
- src/memoir/services/store_service.py (not served here)
- src/memoir/services/sync_service.py (not served here)
- src/memoir/services/vector_service.py (not served here)
- src/memoir/services/watch_service.py (not served here)
- src/memoir/store/__init__.py (not served here)
- src/memoir/store/backend.py (not served here)
- src/memoir/store/cwd_locked.py (not served here)
- src/memoir/store/git_safety.py (not served here)
- src/memoir/store/gitcmd.py (not served here)
- src/memoir/store/node_gc.py (not served here)
- src/memoir/store/prolly_adapter.py (not served here)
- src/memoir/store/repo_mode.py (not served here)
- src/memoir/store/write_lock.py (not served here)
- src/memoir/taxonomy/__init__.py (not served here)
- src/memoir/taxonomy/data/general/descriptions.md (not served here)
- src/memoir/taxonomy/data/general/examples.md (not served here)
- src/memoir/taxonomy/data/general/presets.md (not served here)
- src/memoir/taxonomy/iterative.py (not served here)
- src/memoir/taxonomy/loader.py (not served here)
- src/memoir/taxonomy/markdown_source.py (not served here)
- src/memoir/taxonomy/registry.py (not served here)
- src/memoir/taxonomy/semantic.py (not served here)
- src/memoir/taxonomy/taxonomy.py (not served here)
- src/memoir/tui/__init__.py (not served here)
- src/memoir/tui/app.py (not served here)
- src/memoir/tui/data.py (not served here)
- src/memoir/tui/screens/__init__.py (not served here)
- src/memoir/tui/screens/help.py (not served here)
- src/memoir/tui/screens/main.py (not served here)
- src/memoir/tui/widgets/__init__.py (not served here)
- src/memoir/tui/widgets/commits_pane.py (not served here)
- src/memoir/tui/widgets/diff_view.py (not served here)
- src/memoir/tui/widgets/memory_viewer.py (not served here)
- src/memoir/tui/widgets/outline_pane.py (not served here)
- src/memoir/tui/widgets/watch_pane.py (not served here)
- src/memoir/ui/__init__.py (not served here)
- src/memoir/ui/handlers/__init__.py (not served here)
- src/memoir/ui/handlers/api_handler.py (not served here)
- src/memoir/ui/handlers/branch_handler.py (not served here)
- src/memoir/ui/handlers/crypto_handler.py (not served here)
- src/memoir/ui/handlers/memory_handler.py (not served here)
- src/memoir/ui/handlers/store_handler.py (not served here)
- src/memoir/ui/handlers/utils.py (not served here)
- src/memoir/ui/handlers/watch_handler.py (not served here)
- src/memoir/ui/initializer.py (not served here)
- src/memoir/ui/reader.py (not served here)
- src/memoir/ui/schemas/__init__.py (not served here)
- src/memoir/ui/schemas/branches.py (not served here)
- src/memoir/ui/schemas/commits.py (not served here)
- src/memoir/ui/schemas/diff.py (not served here)
- src/memoir/ui/schemas/memory.py (not served here)
- src/memoir/ui/schemas/statistics.py (not served here)
- src/memoir/ui/schemas/store.py (not served here)
- src/memoir/ui/schemas/timeline.py (not served here)
- src/memoir/ui/server.py (not served here)
- src/memoir/ui/webapp/.gitignore (not served here)
- src/memoir/ui/webapp/index.html (not served here)
- src/memoir/ui/webapp/package-lock.json (not served here)
- src/memoir/ui/webapp/package.json (not served here)
- src/memoir/ui/webapp/pnpm-lock.yaml (not served here)
- src/memoir/ui/webapp/pnpm-workspace.yaml (not served here)
- src/memoir/ui/webapp/public/memoir.png (not served here)
- src/memoir/ui/webapp/src/App.tsx (not served here)
- src/memoir/ui/webapp/src/api/client.test.ts (not served here)
- src/memoir/ui/webapp/src/api/client.ts (not served here)
- src/memoir/ui/webapp/src/api/types.ts (not served here)
- src/memoir/ui/webapp/src/commands/CommandAutocomplete.css (not served here)
- src/memoir/ui/webapp/src/commands/CommandAutocomplete.tsx (not served here)
- src/memoir/ui/webapp/src/commands/availability.test.ts (not served here)
- src/memoir/ui/webapp/src/commands/match.test.ts (not served here)
- src/memoir/ui/webapp/src/commands/match.ts (not served here)
- src/memoir/ui/webapp/src/commands/parity.test.ts (not served here)
- src/memoir/ui/webapp/src/commands/registry.test.ts (not served here)
- src/memoir/ui/webapp/src/commands/registry.ts (not served here)
- src/memoir/ui/webapp/src/config/runtime.test.ts (not served here)
- src/memoir/ui/webapp/src/config/runtime.ts (not served here)
- src/memoir/ui/webapp/src/drawers/CommitDetail.tsx (not served here)
- src/memoir/ui/webapp/src/drawers/DrawerPanels.css (not served here)
- src/memoir/ui/webapp/src/drawers/MemoryDetail.test.tsx (not served here)
- src/memoir/ui/webapp/src/drawers/MemoryDetail.tsx (not served here)
- src/memoir/ui/webapp/src/drawers/RangeDiff.tsx (not served here)
- src/memoir/ui/webapp/src/layout/AppShell.css (not served here)
- src/memoir/ui/webapp/src/layout/AppShell.tsx (not served here)
- src/memoir/ui/webapp/src/layout/BranchMatchToggle.tsx (not served here)
- src/memoir/ui/webapp/src/layout/BranchSwitcher.css (not served here)
- src/memoir/ui/webapp/src/layout/BranchSwitcher.tsx (not served here)
- src/memoir/ui/webapp/src/layout/CommandBar.css (not served here)
- src/memoir/ui/webapp/src/layout/CommandBar.tsx (not served here)
- src/memoir/ui/webapp/src/layout/FilterBar.css (not served here)
- src/memoir/ui/webapp/src/layout/FilterBar.tsx (not served here)
- src/memoir/ui/webapp/src/layout/LeftPane.css (not served here)
- src/memoir/ui/webapp/src/layout/LeftPane.tsx (not served here)
- src/memoir/ui/webapp/src/layout/LiveAnnouncer.css (not served here)
- src/memoir/ui/webapp/src/layout/LiveAnnouncer.tsx (not served here)
- src/memoir/ui/webapp/src/layout/MainCanvas.css (not served here)
- src/memoir/ui/webapp/src/layout/MainCanvas.tsx (not served here)
- src/memoir/ui/webapp/src/layout/RightDrawer.css (not served here)
- src/memoir/ui/webapp/src/layout/RightDrawer.tsx (not served here)
- src/memoir/ui/webapp/src/layout/TopBar.css (not served here)
- src/memoir/ui/webapp/src/layout/TopBar.test.tsx (not served here)
- src/memoir/ui/webapp/src/layout/TopBar.tsx (not served here)
- src/memoir/ui/webapp/src/layout/ViewToolbar.css (not served here)
- src/memoir/ui/webapp/src/layout/ViewToolbar.tsx (not served here)
- src/memoir/ui/webapp/src/lib/category.ts (not served here)
- src/memoir/ui/webapp/src/lib/storage.test.ts (not served here)
- src/memoir/ui/webapp/src/lib/storage.ts (not served here)
- src/memoir/ui/webapp/src/lib/time.test.ts (not served here)
- src/memoir/ui/webapp/src/lib/time.ts (not served here)
- src/memoir/ui/webapp/src/lib/wildcard.test.ts (not served here)
- src/memoir/ui/webapp/src/lib/wildcard.ts (not served here)
- src/memoir/ui/webapp/src/main.tsx (not served here)
- src/memoir/ui/webapp/src/modals/BranchCommitsModal.css (not served here)
- src/memoir/ui/webapp/src/modals/BranchCommitsModal.tsx (not served here)
- src/memoir/ui/webapp/src/modals/BranchFromCommitModal.css (not served here)
- src/memoir/ui/webapp/src/modals/BranchFromCommitModal.tsx (not served here)
- src/memoir/ui/webapp/src/modals/BringOverMemoriesModal.css (not served here)
- src/memoir/ui/webapp/src/modals/BringOverMemoriesModal.tsx (not served here)
- src/memoir/ui/webapp/src/modals/CommandReferenceModal.css (not served here)
- src/memoir/ui/webapp/src/modals/CommandReferenceModal.tsx (not served here)
- src/memoir/ui/webapp/src/modals/StatsModal.css (not served here)
- src/memoir/ui/webapp/src/modals/StatsModal.tsx (not served here)
- src/memoir/ui/webapp/src/modals/SyncBranchesModal.css (not served here)
- src/memoir/ui/webapp/src/modals/SyncBranchesModal.tsx (not served here)
- src/memoir/ui/webapp/src/state/configSlice.test.ts (not served here)
- src/memoir/ui/webapp/src/state/configSlice.ts (not served here)
- src/memoir/ui/webapp/src/state/historySelectionSlice.test.ts (not served here)
- src/memoir/ui/webapp/src/state/historySelectionSlice.ts (not served here)
- src/memoir/ui/webapp/src/state/memorySelectionSlice.ts (not served here)
- src/memoir/ui/webapp/src/state/selectionSlice.test.ts (not served here)
- src/memoir/ui/webapp/src/state/selectionSlice.ts (not served here)
- src/memoir/ui/webapp/src/state/storeSlice.ts (not served here)
- src/memoir/ui/webapp/src/state/uiSlice.test.ts (not served here)
- src/memoir/ui/webapp/src/state/uiSlice.ts (not served here)
- src/memoir/ui/webapp/src/styles/global.css (not served here)
- src/memoir/ui/webapp/src/styles/tokens.css (not served here)
- src/memoir/ui/webapp/src/styles/typography.css (not served here)
- src/memoir/ui/webapp/src/views/commits/CommitList.css (not served here)
- src/memoir/ui/webapp/src/views/commits/CommitList.tsx (not served here)
- src/memoir/ui/webapp/src/views/commits/CommitRow.css (not served here)
- src/memoir/ui/webapp/src/views/commits/CommitRow.tsx (not served here)
- src/memoir/ui/webapp/src/views/graph/TaxonomyGraph.css (not served here)
- src/memoir/ui/webapp/src/views/graph/TaxonomyGraph.tsx (not served here)
- src/memoir/ui/webapp/src/views/history/CategoryTree.css (not served here)
- src/memoir/ui/webapp/src/views/history/CategoryTree.tsx (not served here)
- src/memoir/ui/webapp/src/views/history/HistoryView.css (not served here)
- src/memoir/ui/webapp/src/views/history/HistoryView.tsx (not served here)
- src/memoir/ui/webapp/src/views/places/PlacesView.css (not served here)
- src/memoir/ui/webapp/src/views/places/PlacesView.tsx (not served here)
- src/memoir/ui/webapp/src/views/timeline/TimelineView.css (not served here)
- src/memoir/ui/webapp/src/views/timeline/TimelineView.tsx (not served here)
- src/memoir/ui/webapp/src/views/tree/TaxonomyTree.css (not served here)
- src/memoir/ui/webapp/src/views/tree/TaxonomyTree.tsx (not served here)
- src/memoir/ui/webapp/src/views/tree/TreeNodeView.tsx (not served here)
- src/memoir/ui/webapp/src/views/tree/buildTaxonomy.test.ts (not served here)
- src/memoir/ui/webapp/src/views/tree/buildTaxonomy.ts (not served here)
- src/memoir/ui/webapp/src/views/watch/WatchView.css (not served here)
- src/memoir/ui/webapp/src/views/watch/WatchView.tsx (not served here)
- src/memoir/ui/webapp/src/vite-env.d.ts (not served here)
- src/memoir/ui/webapp/tsconfig.json (not served here)
- src/memoir/ui/webapp/vite.config.ts (not served here)
- static/memoir-light.png (not served here)
- static/memoir.png (not served here)
- tests/__init__.py (not served here)
- tests/conftest.py (not served here)
- tests/data/llm_locomo10_responses.json (not served here)
- tests/data/llm_responses.json (not served here)
- tests/fake_cloud.py (not served here)
- tests/pytest.ini (not served here)
- tests/test_backend_resolution.py (not served here)
- tests/test_branch_routing.py (not served here)
- tests/test_capture.py (not served here)
- tests/test_classifier.py (not served here)
- tests/test_cli.py (not served here)
- tests/test_cloud_agent.py (not served here)
- tests/test_cloud_gateways.py (not served here)
- tests/test_cloud_login.py (not served here)
- tests/test_cloud_sync.py (not served here)
- tests/test_diff_keys.py (not served here)
Advantages
- Provides Git-like version control for AI memory, allowing for branching, merging, and rolling back. evidence: README.md
- Uses hierarchical semantic paths for O(log n) lookups, offering better performance than traditional vector databases. evidence: README.md
Limitations
- Requires an API key for LLM-powered features like intelligent classification and semantic search. evidence: README.md
- Some advanced features like document watching require additional dependencies or manual configuration. evidence: pyproject.toml
Security
Risk level: Medium risk
This brain runs
Git hooks (5)
.pre-commit-config.yaml:pre-commit hooks from https://github.com/pre-commit/pre-commit-hooks at v6.0.0 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/pycqa/isort at 6.0.1 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/astral-sh/ruff-pre-commit at v0.12.9 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pre-commit hooks from https://github.com/PyCQA/bandit at 1.8.6 (contributor tooling: runs only after pre-commit install)· uses the network.pre-commit-config.yaml:pytest
Agent instructions that run or fetch something (73)
CLAUDE.md:`make ci` runs the full pipeline (lint, test, security, docs).CLAUDE.md:tests use the fake gateway in `tests/fake_cloud.py` (real `git http-backend`, no network).CLAUDE.md:When touching the mod run `claude plugin validate plugins/claude-code` and `claude plugin test plugins/claude-code`;CLAUDE.md:Run with `pytest`.CLAUDE.md:Deep structural details (layouts, refactor history, per-file line counts) intentionally omitted — use `rg` / `git log` when you need them.CLAUDE.md:flipping it later (`git init`, or `rm -rf .git`) surfaces a warning at SessionStart but does not block writes.CLAUDE.md:When changing a prompt, **run the harness against haiku before merging**.CLAUDE.md:The harness has two modes: **gate** (deterministic shell-hook tests, no LLM, sub-second per case — pins the recall-trigger gate in `hooks/user-prompt-submit.sh`) and **LLM mode** (`run` / `case` / `adhoc` against `claude -p` for prompt templates).CLAUDE.md:# Gate mode — no LLM cost, run on every commit.CLAUDE.md:plugins/claude-code/tests/prompt-harness/runner.py run --prompt stop_capture --model haikuCLAUDE.md:plugins/claude-code/tests/prompt-harness/runner.py run --prompt stop_capture --model sonnetCLAUDE.md:Every run drops `system.txt` (the assembled prompt actually sent), `input.txt`, `output.txt`, `command.sh` (replayable), and `result.json` per case under `/tmp/memoir-prompt-tests/<UTC-timestamp>/`.CLAUDE.md:Skill prompts (`skills/<name>/SKILL.md`) are evaluated by the orchestrating Claude rather than dispatched as system prompts to a model, so they are *not* covered by this harness — to test those, run the slash command in a real session and inspect behavior.CLAUDE.md:**Build the docs locally:** `make docs` (mkdocs) → `site/index.html`, or `make docs-live` for auto-reload.plugins/claude-code/skills/memoir-onboard/SKILL.md:bash -c 'source "${CLAUDE_PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; in_git_repo && echo codebase:onboard || echo project:onboard'plugins/claude-code/skills/memoir-onboard/SKILL.md:Store: !`bash -c 'if [ -n "${MEMOIR_STORE:-}" ];plugins/claude-code/skills/memoir-onboard/SKILL.md:`$MEMOIR` is a wrapper that resolves the right invocation for this machine — `memoir` on PATH if installed, otherwise `uvx --from memoir-ai==<pin> memoir`, otherwise `uv tool run --from memoir-ai==<pin> memoir` (pin lives in `scripts/resolve-memoir-cli.sh`).plugins/claude-code/skills/memoir-onboard/SKILL.md:Wrap **every** memoir call — both branches A and B, both reads and writes — in a subshell that cd's into the store first, and use `"$MEMOIR"` (NOT bare `memoir`) so the call works on machines without a global memoir install:plugins/claude-code/skills/memoir-onboard/SKILL.md:`test.strategy` — test layout, how to run tests, what coverage emphasizes.plugins/claude-code/skills/memoir-onboard/SKILL.md:bash -c 'source "${CLAUDE_PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; concurrent_session_warning'plugins/claude-code/skills/memoir-onboard/SKILL.md:If the command prints anything, stop and report: "Concurrent session detected — run /memoir:onboard after the other session finishes, or set a distinct MEMOIR_STORE."plugins/claude-code/skills/memoir-onboard/SKILL.md:`git log --oneline -20` and `git log --stat -5` for recent change patterns (informs lessons / rules).plugins/claude-code/skills/memoir-onboard/SKILL.md:Run `git log --stat <last_sha>..HEAD` to enumerate changed paths since the last onboarding pass.plugins/claude-code/skills/memoir-onboard/SKILL.md:Run the confirmation check (`memoir status` → path == `$STORE_PATH`) before doing any writes.plugins/claude-code/skills/memoir-onboard/SKILL.md:`python3 ${CLAUDE_PLUGIN_ROOT}/skills/memoir-onboard/extractors.py walk <root>` — JSON list of `{path, size, mtime_ns, kind}` plus `snapshot_hash`.plugins/claude-code/skills/memoir-onboard/SKILL.md:`python3 ${CLAUDE_PLUGIN_ROOT}/skills/memoir-onboard/extractors.py extract <path>` — `key=value` blob for one file (with `kind=` first, `extractor.stdlib.fields=[…]` for provenance).plugins/claude-code/skills/memoir-onboard/SKILL.md:`python3 ${CLAUDE_PLUGIN_ROOT}/skills/memoir-onboard/extractors.py snapshot-hash <root>` — just the hash.plugins/claude-code/skills/memoir-onboard/SKILL.md:`python3 ${CLAUDE_PLUGIN_ROOT}/skills/memoir-onboard/extractors.py tree <root>` — pruned tree.plugins/claude-code/skills/memoir-onboard/SKILL.md:`python3 ${CLAUDE_PLUGIN_ROOT}/skills/memoir-onboard/extractors.py shape <root>` — `{shape, overview}` JSON.plugins/claude-code/skills/memoir-onboard/SKILL.md:bash -c 'source "${CLAUDE_PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; concurrent_session_warning'plugins/claude-code/skills/memoir-onboard/SKILL.md:For each file in the walk result, run `extractors.py extract <path>` and capture the structured blob.plugins/claude-code/skills/memoir-onboard/SKILL.md:python3 -c "import json,sys; print('\n'.join(e['path'] for e in json.loads(sys.argv[1])['files']))" "$WALK_JSON" \plugins/claude-code/skills/memoir-onboard/SKILL.md:**added** (in walk, not in store) → run `extract <path>`, write `files.<san>.meta` and `files.<san>.summary`.plugins/claude-code/skills/memoir-onboard/SKILL.md:**modified** (same path, different `(size, mtime_ns)`) → re-run `extract <path>`, write both keys.plugins/claude-code/skills/memoir-onboard/SKILL.md:If a cold run fails partway through, the `_meta.*` keys act as commit markers.plugins/claude-code/skills/memory-recall/SKILL.md:Run this preamble first and reuse `$STORE` and `$MEMOIR` for every memoir invocation below:plugins/claude-code/skills/memory-recall/SKILL.md:`$MEMOIR` is a wrapper that resolves the right invocation for this machine — `memoir` on PATH if installed, otherwise `uvx --from memoir-ai==<pin> memoir`, otherwise `uv tool run --from memoir-ai==<pin> memoir` (pin lives in `scripts/resolve-memoir-cli.sh`).plugins/claude-code/skills/memory-recall/SKILL.md:that way recall works on machines where memoir isn't `pip install`ed but `uv` is.plugins/codex/skills/memoir-onboard/SKILL.md:bash -c 'source "${PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; in_git_repo && echo codebase:onboard || echo project:onboard'plugins/codex/skills/memoir-onboard/SKILL.md:Store: !`bash -c 'if [ -n "${MEMOIR_STORE:-}" ];plugins/codex/skills/memoir-onboard/SKILL.md:python3 - "$manifest" <<'PY'plugins/codex/skills/memoir-onboard/SKILL.md:`$MEMOIR` is a wrapper that resolves the right invocation for this machine — `memoir` on PATH if installed, otherwise `uvx --from memoir-ai==<pin> memoir`, otherwise `uv tool run --from memoir-ai==<pin> memoir` (pin lives in `scripts/resolve-memoir-cli.sh`).plugins/codex/skills/memoir-onboard/SKILL.md:Wrap **every** memoir call — both branches A and B, both reads and writes — in a subshell that cd's into the store first, and use `"$MEMOIR"` (NOT bare `memoir`) so the call works on machines without a global memoir install:plugins/codex/skills/memoir-onboard/SKILL.md:`test.strategy` — test layout, how to run tests, what coverage emphasizes.plugins/codex/skills/memoir-onboard/SKILL.md:bash -c 'source "${PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; concurrent_session_warning'plugins/codex/skills/memoir-onboard/SKILL.md:If the command prints anything, stop and report: "Concurrent session detected - run memoir-onboard after the other session finishes, or set a distinct MEMOIR_STORE."plugins/codex/skills/memoir-onboard/SKILL.md:`git log --oneline -20` and `git log --stat -5` for recent change patterns (informs lessons / rules).plugins/codex/skills/memoir-onboard/SKILL.md:Run `git log --stat <last_sha>..HEAD` to enumerate changed paths since the last onboarding pass.plugins/codex/skills/memoir-onboard/SKILL.md:Run the confirmation check (`memoir status` → path == `$STORE_PATH`) before doing any writes.plugins/codex/skills/memoir-onboard/SKILL.md:`python3 ${PLUGIN_ROOT}/skills/memoir-onboard/extractors.py walk <root>` — JSON list of `{path, size, mtime_ns, kind}` plus `snapshot_hash`.plugins/codex/skills/memoir-onboard/SKILL.md:`python3 ${PLUGIN_ROOT}/skills/memoir-onboard/extractors.py extract <path>` — `key=value` blob for one file (with `kind=` first, `extractor.stdlib.fields=[…]` for provenance).plugins/codex/skills/memoir-onboard/SKILL.md:`python3 ${PLUGIN_ROOT}/skills/memoir-onboard/extractors.py snapshot-hash <root>` — just the hash.plugins/codex/skills/memoir-onboard/SKILL.md:`python3 ${PLUGIN_ROOT}/skills/memoir-onboard/extractors.py tree <root>` — pruned tree.plugins/codex/skills/memoir-onboard/SKILL.md:`python3 ${PLUGIN_ROOT}/skills/memoir-onboard/extractors.py shape <root>` — `{shape, overview}` JSON.plugins/codex/skills/memoir-onboard/SKILL.md:bash -c 'source "${PLUGIN_ROOT}/hooks/common.sh" >/dev/null 2>&1; concurrent_session_warning'plugins/codex/skills/memoir-onboard/SKILL.md:For each file in the walk result, run `extractors.py extract <path>` and capture the structured blob.plugins/codex/skills/memoir-onboard/SKILL.md:python3 -c "import json,sys; print('\n'.join(e['path'] for e in json.loads(sys.argv[1])['files']))" "$WALK_JSON" \plugins/codex/skills/memoir-onboard/SKILL.md:**added** (in walk, not in store) → run `extract <path>`, write `files.<san>.meta` and `files.<san>.summary`.plugins/codex/skills/memoir-onboard/SKILL.md:**modified** (same path, different `(size, mtime_ns)`) → re-run `extract <path>`, write both keys.plugins/codex/skills/memoir-onboard/SKILL.md:If a cold run fails partway through, the `_meta.*` keys act as commit markers.plugins/codex/skills/memoir-onboard/SKILL.md:A subsequent forced memoir-onboard run will rewrite cleanly.plugins/codex/skills/memoir-remember/SKILL.md:python3 - "$manifest" <<'PY'plugins/codex/skills/memoir-remember/SKILL.md:bash "$PLUGIN_ROOT/scripts/ensure-store.sh" "$STORE" >/dev/nullplugins/codex/skills/memoir-status/SKILL.md:Run:plugins/codex/skills/memoir-status/SKILL.md:python3 - "$manifest" <<'PY'plugins/codex/skills/memoir-status/SKILL.md:bash "$PLUGIN_ROOT/scripts/status-cmd.sh"plugins/codex/skills/memoir-ui/SKILL.md:Run:plugins/codex/skills/memoir-ui/SKILL.md:python3 - "$manifest" <<'PY'plugins/codex/skills/memoir-ui/SKILL.md:bash "$PLUGIN_ROOT/scripts/memoir-ui-ctl.sh" start "$STORE"plugins/codex/skills/memory-recall/SKILL.md:Run this preamble first and reuse `$STORE` and `$MEMOIR` for every memoir invocation below:plugins/codex/skills/memory-recall/SKILL.md:python3 - "$manifest" <<'PY'plugins/codex/skills/memory-recall/SKILL.md:`$MEMOIR` is a wrapper that resolves the right invocation for this machine — `memoir` on PATH if installed, otherwise `uvx --from memoir-ai==<pin> memoir`, otherwise `uv tool run --from memoir-ai==<pin> memoir` (pin lives in `scripts/resolve-memoir-cli.sh`).plugins/codex/skills/memory-recall/SKILL.md:that way recall works on machines where memoir isn't `pip install`ed but `uv` is.
Install scripts (2)
Makefile(make install):pip install -e .README.md:curl -LsSf https://astral.sh/uv/install.sh | sh· uses the network
MCP servers (1)
README.md(memoir):uvx --from memoir-ai[mcp] memoir-mcp
Hooks (7)
plugins/claude-code/hooks/hooks.json(SessionStart):bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.shplugins/claude-code/hooks/hooks.json(UserPromptSubmit):bash ${CLAUDE_PLUGIN_ROOT}/hooks/user-prompt-submit.shplugins/claude-code/hooks/hooks.json(Stop):bash ${CLAUDE_PLUGIN_ROOT}/hooks/stop.shplugins/claude-code/hooks/hooks.json(SessionEnd):bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-end.shplugins/codex/hooks/hooks.json(SessionStart):bash "${PLUGIN_ROOT}/hooks/session-start.sh"plugins/codex/hooks/hooks.json(UserPromptSubmit):bash "${PLUGIN_ROOT}/hooks/user-prompt-submit.sh"plugins/codex/hooks/hooks.json(Stop):bash "${PLUGIN_ROOT}/hooks/stop.sh"
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:2)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:23)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:30)
- Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:40)
- Medium risk: runs-install-script-remote-exec (README.md:86)
- Medium risk: runs-mcp-server-unpinned-runner (README.md:153)
- Low risk: network-instructions (Makefile:37)
- Low risk: scripts-present (benchmarks/classifier.py)
- Low risk: scripts-present (benchmarks/locomo/run.py)
- Low risk: scripts-present (plugins/claude-code/hooks/session-end.sh)
- Low risk: scripts-present (plugins/claude-code/hooks/session-start.sh)
- Low risk: scripts-present (plugins/claude-code/hooks/stop.sh)
- Low risk: scripts-present (plugins/claude-code/hooks/user-prompt-submit.sh)
- Low risk: network-instructions (plugins/claude-code/skills/memory-recall/SKILL.md:20)
- Low risk: scripts-present (plugins/codex/hooks/session-start.sh)
- Low risk: scripts-present (plugins/codex/hooks/stop.sh)
- Low risk: scripts-present (plugins/codex/hooks/user-prompt-submit.sh)
- Low risk: network-instructions (plugins/codex/skills/memory-recall/SKILL.md:36)
- Low risk: network-instructions (pyproject.toml:57)
- Low risk: scripts-present (scripts/cc-smoke/run.sh)
- Low risk: scripts-present (scripts/check_version_consistency.py)
Attribution and licence
- First committed by
zhangfengcdt
- Declared authors
- zhangfengcdt (declared in pyproject.toml)
- Publisher
- Feng Zhang (Community)
- Source
- zhangfengcdt/memoir · commit 7fd1b3e
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- zhangfengcdt, rapidSpace, disafronov, KevFoxCodeCraft, Ottohere-Mourn
AutoGineer is not affiliated with or endorsed by zhangfengcdt.
Install from source
489 of its files are not served here, so there is no ZIP. zhangfengcdt/memoir at 7fd1b3e