From b517dcdfd3c2a7c45c6ea21d0aec68f5be790c92 Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:08:36 -0700 Subject: [PATCH 1/7] fix: never repoint a consumer's git hooks in postinstall postinstall ran `git config core.hooksPath .githooks` unconditionally, so installing agentmemory as a dependency repointed the *consumer's* repo at a .githooks directory that isn't shipped (it's absent from the package.json "files" allowlist), silently breaking their commits. Gate the hook setup to a real source checkout and scope `git config` to packageRoot via cwd. Co-Authored-By: Claude Opus 4.8 --- scripts/postinstall.cjs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/scripts/postinstall.cjs b/scripts/postinstall.cjs index b346a06..7599e7b 100644 --- a/scripts/postinstall.cjs +++ b/scripts/postinstall.cjs @@ -1,6 +1,9 @@ const { spawnSync } = require("node:child_process"); +const fs = require("node:fs"); const path = require("node:path"); +const packageRoot = path.resolve(__dirname, ".."); + function hasQmd() { const result = spawnSync("qmd", ["status"], { stdio: "ignore", @@ -14,23 +17,39 @@ function memoryDir() { return path.join(home, ".agent-memory"); } +// Distinguish a development checkout of agentmemory from an end-user install. +// When agentmemory is installed as a dependency it lives under node_modules and +// ships without the `.githooks` directory (it's absent from the package.json +// "files" allowlist). We must never touch a consumer's repo or VCS config, so +// the dev-only hook setup below is gated on "are we actually in the source repo?". +function isDevCheckout() { + if (packageRoot.split(path.sep).includes("node_modules")) return false; + return fs.existsSync(path.join(packageRoot, ".githooks")); +} + +// Point git at the repo's tracked hooks (lint + tests on commit). Scoped to the +// agentmemory working tree only — `cwd` + the dev-checkout gate ensure we only +// ever write to this repo's local git config, never a consumer's. function configureGitHooks() { - const result = spawnSync("git", ["rev-parse", "--is-inside-work-tree"], { + const insideRepo = spawnSync("git", ["rev-parse", "--is-inside-work-tree"], { + cwd: packageRoot, stdio: "ignore", shell: process.platform === "win32", }); - - if (result.status !== 0) { + if (insideRepo.status !== 0) { return; } spawnSync("git", ["config", "core.hooksPath", ".githooks"], { + cwd: packageRoot, stdio: "ignore", shell: process.platform === "win32", }); } -configureGitHooks(); +if (isDevCheckout()) { + configureGitHooks(); +} if (!hasQmd()) { const dir = memoryDir(); From 46078f09482ab6ebc1e869dcfd3800105c14b2aa Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:08:36 -0700 Subject: [PATCH 2/7] ci: gate npm publish behind tag-version check, lint, build, and tests The publish workflow went straight from `npm ci` to `npm publish` with no verification. Require the v* tag to match package.json version (and manual runs to dispatch from a release tag), and run lint + build + tests first. Add setup-bun since prepack builds the CLI with bun. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/publish-npm.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 512cf45..8719f51 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -21,5 +21,28 @@ jobs: node-version: 20 cache: npm registry-url: "https://registry.npmjs.org" + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - run: npm ci + - name: Verify tag matches package.json version + shell: bash + run: | + case "$GITHUB_REF" in + refs/tags/v*) ;; + *) + echo "Publishing requires a v* tag ref; got $GITHUB_REF." >&2 + echo "For manual runs, dispatch the workflow from the release tag." >&2 + exit 1 + ;; + esac + tag="${GITHUB_REF_NAME#v}" + pkg="$(node -p "require('./package.json').version")" + if [ "$tag" != "$pkg" ]; then + echo "Tag $GITHUB_REF_NAME does not match package.json version $pkg" >&2 + exit 1 + fi + - run: npm run lint + - run: npm run build + - run: npm test - run: npm publish From fcd81c00c9d23766680d80afb743ec1c418d1a10 Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:08:36 -0700 Subject: [PATCH 3/7] ci: run the real unit + cli test suites The test job was leftover from pi-memory: it set PI_E2E_PROVIDER/OpenAI env and only ran `npm test` when OPENAI_API_KEY was present, else skipped. But agentmemory's tests are the no-key bun suites, so they never ran in CI. Run test:unit and test:cli on bun instead. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/ci.yml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09fed2b..dde660d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,20 +32,15 @@ jobs: test: runs-on: ubuntu-latest - env: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - PI_E2E_PROVIDER: openai - PI_E2E_MODEL: gpt-4o-mini steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - run: npm ci - - name: Run e2e tests - if: ${{ env.OPENAI_API_KEY != '' }} - run: npm test - - name: Skip e2e tests (missing OPENAI_API_KEY) - if: ${{ env.OPENAI_API_KEY == '' }} - run: echo "Skipping e2e tests. Add an OPENAI_API_KEY repository secret to enable." + - run: npm run test:unit + - run: npm run test:cli From 0ae2996bbab2089042fd3563cd9f421c2e4bee6c Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:08:36 -0700 Subject: [PATCH 4/7] feat: add opt-in live embeddings probe to status `agent-memory status --probe` runs a tiny semantic query and checks for qmd's "need embeddings" warning to confirm semantic/deep search is actually usable, beyond the cheap pending-embed count. Opt-in because it costs a real qmd query and a possible model load; default status stays sub-second. Co-Authored-By: Claude Opus 4.8 --- src/cli.ts | 20 +++++++++++++++++++- src/core.ts | 27 +++++++++++++++++++++++++++ test/cli.test.ts | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/cli.ts b/src/cli.ts index 6ad2065..c1b1ce7 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -43,6 +43,7 @@ import { installSkills, nowTimestamp, parseScratchpad, + probeEmbeddings, readFileSafe, runQmdEmbedDetached, runQmdSearch, @@ -665,11 +666,18 @@ async function cmdStatus(flags: Record) { const qmdFound = await detectQmd(); let hasCollection = false; let health = null; + let embeddings: "ready" | "missing" | "unknown" | "n/a" = "n/a"; if (qmdFound) { hasCollection = await checkCollection(); if (hasCollection) { await ensureQmdAvailableForSync(); health = await getQmdHealth(); + // A live semantic probe confirms embeddings are actually usable, but + // it costs a real qmd query (and a possible model load), so it's + // opt-in — the cheap pending-embed count below covers the common case. + if (hasFlag(flags, "probe")) { + embeddings = await probeEmbeddings(); + } } } @@ -695,6 +703,7 @@ async function cmdStatus(flags: Record) { available: qmdFound, collection: hasCollection ? getCollectionName() : null, health, + embeddings, }, embedMode, }, @@ -725,6 +734,15 @@ async function cmdStatus(flags: Record) { `Collection '${getCollectionName()}': ${hasCollection ? "configured" : "not configured — run: agent-memory init"}`, ); console.log(`Embed mode: ${embedMode}`); + if (hasCollection && embeddings !== "n/a") { + const embLabel = + embeddings === "ready" + ? "ready" + : embeddings === "missing" + ? "missing — run: agent-memory sync" + : "unknown (could not verify within probe timeout)"; + console.log(`Embeddings (semantic/deep search): ${embLabel}`); + } if (health) { if (health.totalFiles !== null) console.log(`Files indexed: ${health.totalFiles}`); if (health.vectorsEmbedded !== null) console.log(`Vectors embedded: ${health.vectorsEmbedded}`); @@ -789,7 +807,7 @@ Commands: distil Generate compact MEMORY.md index from daily logs + topics sync Re-index and embed all files (requires qmd) init Initialize memory directory and qmd collection - status Show configuration and status + status Show configuration and status (--probe for a live embeddings check) Global flags: --dir Override memory directory diff --git a/src/core.ts b/src/core.ts index 0219140..0935008 100644 --- a/src/core.ts +++ b/src/core.ts @@ -1171,6 +1171,33 @@ export function runQmdSearch( }); } +/** + * Best-effort check of whether vector embeddings are actually usable for + * semantic/deep search right now. Runs a tiny semantic probe and looks for + * qmd's "need embeddings" warning. Bounded by a short timeout because the very + * first semantic query can trigger a model download — returns "unknown" rather + * than blocking on it. "ready" means the probe ran without the warning; it does + * not prove the index has content. + */ +export async function probeEmbeddings(): Promise<"ready" | "missing" | "unknown"> { + let timer: ReturnType | undefined; + try { + const { stderr } = await Promise.race([ + runQmdSearch("semantic", "memory", 1), + new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error("timeout")), 4_000); + }), + ]); + return /need embeddings/i.test(stderr ?? "") ? "missing" : "ready"; + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + if (/need embeddings/i.test(msg)) return "missing"; + return "unknown"; + } finally { + clearTimeout(timer); + } +} + // --------------------------------------------------------------------------- // Standalone tool functions // --------------------------------------------------------------------------- diff --git a/test/cli.test.ts b/test/cli.test.ts index d5265c0..5544939 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -330,6 +330,8 @@ describe("CLI subprocess", () => { expect(out.directory).toBe(tmpDir); expect(out.dailyLogs).toBe(0); expect(out.topics).toBe(0); + // Live embeddings probe is opt-in (--probe), so it never runs here. + expect(out.qmd.embeddings).toBe("n/a"); }); test("write and read round-trip", async () => { From 75b3dfff958807f6c051080253f6918b5d4f5c96 Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:21:48 -0700 Subject: [PATCH 5/7] feat: SEO + conversion overhaul for website and README - Point repo homepage to the live GitHub Pages site (was orphaned) - Website: add value-prop hero copy, "Why agentmemory" benefit grid, "How it's different" comparison table, and a "See it in action" example - Website: add Open Graph, Twitter card, canonical, and JSON-LD SoftwareApplication metadata (wires up the existing social-preview.png) - Website: drop leftover "extension" framing; add live npm/stars badges - Add docs/robots.txt and docs/sitemap.xml for indexing - README: surface the website via badge + CTA nav, fix changelog/package naming and code-block alignment Co-Authored-By: Claude Opus 4.8 --- README.md | 97 +++++++++------- docs/index.html | 293 +++++++++++++++++++++++++++++++++++++++++++++-- docs/robots.txt | 4 + docs/sitemap.xml | 8 ++ 4 files changed, 349 insertions(+), 53 deletions(-) create mode 100644 docs/robots.txt create mode 100644 docs/sitemap.xml diff --git a/README.md b/README.md index 591edd6..196f9c1 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,25 @@ -# agent-memory (agentmemory) +# agent-memory -`agentmemory` is the canonical GitHub repository for the `agent-memory` CLI (`myagentmemory` on npm). +**Persistent memory for AI coding agents.** Give [Claude Code](https://claude.ai/code), [OpenAI Codex](https://github.com/openai/codex), [Cursor](https://cursor.com), and Agent (Cursor CLI) a memory that survives across sessions — long-term facts, daily logs, topic notes, and a scratchpad checklist, stored as plain markdown and searchable with [qmd](https://github.com/tobi/qmd)-powered semantic search. -Persistent memory for coding agents — [Claude Code](https://claude.ai/code), [OpenAI Codex](https://github.com/openai/codex), Cursor, and Agent (Cursor CLI). Local-first markdown memory with [qmd](https://github.com/tobi/qmd)-powered semantic search and automatic context injection. +[![npm version](https://img.shields.io/npm/v/myagentmemory?color=cb3837&logo=npm)](https://www.npmjs.com/package/myagentmemory) +[![npm downloads](https://img.shields.io/npm/dm/myagentmemory?color=cb3837&logo=npm)](https://www.npmjs.com/package/myagentmemory) +[![license](https://img.shields.io/npm/l/myagentmemory)](LICENSE) +[![website](https://img.shields.io/badge/website-jayzeng.github.io%2Fagentmemory-0d9b7a)](https://jayzeng.github.io/agentmemory/) -Project site (GitHub Pages): https://jayzeng.github.io/agentmemory/ +**[🌐 Website & quickstart →](https://jayzeng.github.io/agentmemory/)** · [Install](#installation) · [CLI commands](#cli-commands) · [How it works](#how-it-works) -Search aliases: -- `agentmemory` (GitHub repo + Homebrew tap) -- `agent-memory` (CLI command/binary) -- `myagentmemory` (npm package name) -- `coding agent memory` / `AI coding memory` +## Why agent-memory? -GitHub metadata assets: -- Social preview image: `.github/assets/social-preview.png` (1280x640) -- Release notes template: `.github/release.yml` (used by GitHub auto-generated release notes) -- Landing page source: `docs/index.html` (deployed by `.github/workflows/deploy-pages.yml`) +Coding agents forget everything between sessions. `agent-memory` gives them a durable, local-first memory so they stop re-learning your stack, your preferences, and past decisions on every run. -Thanks to https://github.com/skyfallsin/pi-mem for inspiration. +- 🧠 **Memory that persists** — decisions, preferences, and project context carry across sessions instead of starting cold. +- 📁 **Plain markdown, local-first** — every memory is a readable, git-friendly file on disk. No database, no cloud, no lock-in. +- 🔍 **Semantic search** — optional [qmd](https://github.com/tobi/qmd) integration adds keyword, semantic, and hybrid search across all memory files. +- ⚡ **Automatic context injection** — relevant past memories surface into each turn, no manual tool calls required. +- 🤝 **One memory, every agent** — the same store is shared across Claude Code, Codex, Cursor, and Agent. -Long-term facts, daily logs, topic/event notes, and a scratchpad checklist stored as plain markdown files. Optional qmd integration adds keyword, semantic, and hybrid search across all memory files, plus automatic selective injection of relevant past memories into every turn. +> **Naming:** `agentmemory` is the GitHub repo (and Homebrew tap), `myagentmemory` is the npm package, and `agent-memory` is the installed CLI binary. Also known as *coding agent memory* or *AI coding memory*. ## Installation @@ -48,11 +48,7 @@ agent-memory install-skills agent-memory uninstall-skills ``` -### Pi users - -If you're on Pi and prefer a native extension, use `pi-memory` (https://github.com/jayzeng/pi-memory) instead of installing this skill. The CLI + skill workflow here is the cross-platform alternative, and works fine on Pi without any extension. - -This installs: +`install-skills` writes a SKILL.md into each agent's config directory: - `~/.claude/skills/agent-memory/SKILL.md` — Claude Code skill - `~/.codex/skills/agent-memory/SKILL.md` — Codex skill - `~/.cursor/skills/agent-memory/SKILL.md` — Cursor skill @@ -62,6 +58,10 @@ This installs: - `%USERPROFILE%\.cursor\skills\agent-memory\SKILL.md` — Cursor skill (Windows) - `%USERPROFILE%\.agents\skills\agent-memory\SKILL.md` — Agent CLI skill (Windows) +### Pi users + +If you're on Pi and prefer a native extension, use `pi-memory` (https://github.com/jayzeng/pi-memory) instead of installing this skill. The CLI + skill workflow here is the cross-platform alternative, and works fine on Pi without any extension. + ### Optional: Enable search with qmd When qmd is installed, the collection is automatically set up via `agent-memory init`. @@ -80,22 +80,21 @@ Without qmd, all core tools (write/read/scratchpad) work normally. Only `memory_ ## Architecture ``` - ┌──────────────┐ - │ src/core.ts │ ← all logic (paths, truncation, scratchpad, - │ │ context builder, qmd, tool functions) - └──────┬───────┘ - │ - ┌────┴─────────────────┐ - ▼ ▼ - ┌──────────┐ ┌──────────────┐ - │ src/ │ │ skills/ │ - │ cli.ts │ │ ├─ claude-code/SKILL.md - │ │ │ ├─ codex/SKILL.md - │ │ │ ├─ cursor/SKILL.md - │ │ │ └─ agent/SKILL.md - └──────────┘ └──────────────┘ - CLI binary instruction files - `agent-memory` that invoke CLI + ┌───────────────┐ + │ src/core.ts │ ← all logic: paths, truncation, scratchpad, + └───────┬───────┘ context builder, qmd, tool functions + │ + ┌────┴─────┐ + ▼ ▼ + ┌─────────┐ ┌─────────────────────────┐ + │ src/ │ │ skills/ │ + │ cli.ts │ │ ├─ claude-code/SKILL.md │ + │ │ │ ├─ codex/SKILL.md │ + │ │ │ ├─ cursor/SKILL.md │ + │ │ │ └─ agent/SKILL.md │ + └─────────┘ └─────────────────────────┘ + CLI binary instruction files + `agent-memory` that invoke the CLI ``` The memory directory defaults to `~/.agent-memory/`. Override with `AGENT_MEMORY_DIR` env var or `--dir` flag. @@ -130,14 +129,14 @@ If the first search doesn't find what you need, try rephrasing or switching mode ``` ~/.agent-memory/ - MEMORY.md # Curated long-term memory - SCRATCHPAD.md # Checklist of things to fix/remember + MEMORY.md # Curated long-term memory + SCRATCHPAD.md # Checklist of things to fix/remember daily/ - 2026-02-15.md # Daily append-only log + 2026-02-15.md # Daily append-only log 2026-02-14.md ... topics/ - auth.md # Topic/event log linked back to daily entries + auth.md # Topic/event log linked back to daily entries ``` ## Topic notes @@ -165,7 +164,7 @@ Before every agent turn, the following are injected into the system prompt (in p Total injection is capped at 16K chars. When qmd is unavailable, step 3 is skipped and the rest works as before. -For Claude Code, context is injected via the `!`agent-memory context`` syntax in the SKILL.md. For Codex, Cursor, and Agent, the agent runs `agent-memory context` at session start. +For Claude Code, context is injected via the `!`agent-memory context --no-search`` syntax in the SKILL.md. For Codex, Cursor, and Agent, the agent runs `agent-memory context` at session start. ### Selective injection @@ -233,7 +232,7 @@ agent-memory install-skills ```bash # Confirm package name is available -npm view agent-memory +npm view myagentmemory # Bump version (choose patch/minor/major) npm version patch @@ -242,13 +241,23 @@ npm version patch npm publish --access public ``` +### Repository assets (maintainers) + +- **Social preview image:** `.github/assets/social-preview.png` (1280×640) +- **Release notes template:** `.github/release.yml` (used by GitHub auto-generated release notes) +- **Landing page source:** `docs/index.html` (deployed by `.github/workflows/deploy-pages.yml`) + +## Acknowledgments + +Inspired by [skyfallsin/pi-mem](https://github.com/skyfallsin/pi-mem). Semantic search is powered by [qmd](https://github.com/tobi/qmd). + ## Changelog -### 0.5.0 +### 0.4.12 - **Removed pi extension**: Removed `index.ts` and all pi-specific code (`@mariozechner/pi-ai`, `@mariozechner/pi-coding-agent`, `@sinclair/typebox` peer dependencies). - **Standalone tool functions**: Extracted `memoryWrite()`, `memoryRead()`, `scratchpadAction()`, `memorySearch()` into `src/core.ts` as standalone functions usable without any framework. -- **Renamed package**: `pi-memory` → `agent-memory`. +- **Renamed package**: `pi-memory` → `myagentmemory` (npm); the CLI binary is `agent-memory`. - **Renamed env var**: `PI_MEMORY_QMD_UPDATE` → `AGENT_MEMORY_QMD_UPDATE` (old name still works as fallback). - **Default memory directory**: Now always `~/.agent-memory/`. - **Removed pi-specific tests**: Deleted `test/e2e.ts`, `test/eval-recall.ts`, `test/unit.ts`. diff --git a/docs/index.html b/docs/index.html index fffa1cc..8b9e92f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,11 +3,54 @@ - agentmemory - Persistent Memory For Coding Agents + agentmemory — Persistent Memory for Coding Agents (Claude Code, Codex, Cursor) + + + + + + + + + + + + + + + + + + + + + +
-

Persistent memory extension for coding agents

+

Persistent memory for coding agents · CLI + skills

Stop losing context between sessions.

- agentmemory gives your coding agent durable memory with local markdown files, daily logs, scratchpad - checklists, and qmd-powered semantic search. + agentmemory gives your coding agent a durable, local-first memory — long-term facts, daily logs, topic + notes, and a scratchpad checklist, all stored as plain markdown you can read, edit, and commit. Optional + qmd semantic search surfaces the right memory into every turn, + automatically.

+
Claude Code @@ -330,6 +489,122 @@

Stop losing context between sessions.

+
+
+

Why agentmemory?

+

+ Coding agents start every session from zero. agentmemory is the memory layer that makes them + remember — without a database, a cloud account, or vendor lock-in. +

+
+
+
+

🧠 Memory that persists

+

Decisions, preferences, and project context carry across sessions, so your agent stops re-learning your stack on every run.

+
+
+

📁 Plain markdown, local-first

+

Every memory is a readable file on disk — diff it, edit it, commit it to git. No database, no cloud, no lock-in.

+
+
+

🔍 Semantic search

+

Optional qmd integration adds keyword, semantic, and hybrid search across every memory file you've ever written.

+
+
+

⚡ Automatic context injection

+

Relevant past memories surface into each turn on their own — no manual tool calls, no copy-pasting context.

+
+
+

🤝 One memory, every agent

+

The same store is shared across Claude Code, Codex, Cursor, and Agent — switch tools without losing what they know.

+
+
+

⏱️ Zero-config setup

+

Two commands: init and install-skills. Works the moment you install it, qmd or not.

+
+
+
+ +
+
+

How it's different

+

Most memory tools are cloud services with their own SDK and storage. agentmemory is the opposite: files you own, on the agents you already use.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 agentmemoryHosted memory SaaSA single CLAUDE.md
StorageLocal markdown filesVendor cloudOne local file
SearchKeyword + semantic (qmd)Vector DBNone
Auto context injectionYesVariesManual
Works across agentsClaude Code · Codex · Cursor · AgentSDK per appPer project
Account requiredNoYesNo
+
+
+ +
+
+

See it in action

+

Memory is just markdown. Here's what your agent reads back at the start of every session.

+
+
+
# ~/.agent-memory/MEMORY.md
+
+## Stack
+Postgres for all backend services. #decision [[database-choice]]
+URL-prefix API versioning (/v1/) to avoid CDN cache issues. #lesson
+
+## Preferences
+Neovim + LazyVim. Conventional commits. Run tests before every push.
+
+# Recall it later, in any agent:
+$ agent-memory search --query "how do we version the API" --mode semantic
+→ URL-prefix API versioning (/v1/) to avoid CDN cache issues.
+
+
+
+ +
+
+

Install in under a minute

+

Grab the CLI, create your memory store, and wire it into every agent you use.

+
+
+

Install from npm

@@ -357,7 +632,7 @@

Initialize memory

Install skill files

-

Install extension prompts for Claude Code, Codex, Cursor, and Agent CLI.

+

Wire memory into Claude Code, Codex, Cursor, and Agent CLI in one command.

agent-memory install-skills @@ -366,7 +641,7 @@

Install skill files

-

Three-minute setup

+

Setup in three steps

  1. Install `agent-memory` from npm or Homebrew.
  2. Run `agent-memory init` to create local memory storage.
  3. diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 0000000..4cd00f2 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://jayzeng.github.io/agentmemory/sitemap.xml diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..17dbe5d --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,8 @@ + + + + https://jayzeng.github.io/agentmemory/ + weekly + 1.0 + + From 1dded7f302468eac4e270eb162a8799f44ae094a Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:27:09 -0700 Subject: [PATCH 6/7] fix(test): make install-skills detection deterministic in CI The install-skills tests created only the .claude/.codex directories and relied on detection falling back to `command_exists claude`/`codex`. That passed locally (binaries on PATH) but failed in CI where neither binary exists. Write the marker files (settings.json, config.toml) the tests implicitly depend on so detection no longer needs the binaries. Co-Authored-By: Claude Opus 4.8 --- test/cli.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/cli.test.ts b/test/cli.test.ts index 5544939..491eb19 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -561,6 +561,8 @@ describe("CLI subprocess", () => { fs.mkdirSync(path.join(projectDir, "skills", "claude-code"), { recursive: true }); fs.writeFileSync(path.join(projectDir, "skills", "claude-code", "SKILL.md"), "# Claude", "utf-8"); fs.mkdirSync(path.join(homeDir, ".claude"), { recursive: true }); + // Detect via a marker file so the test does not depend on a `claude` binary being on PATH. + fs.writeFileSync(path.join(homeDir, ".claude", "settings.json"), "{}", "utf-8"); const result = Bun.spawnSync( ["bun", "run", path.join(__dirname, "..", "src", "cli.ts"), "install-skills", "--json"], @@ -761,6 +763,9 @@ describe("install scripts", () => { // Install first fs.mkdirSync(path.join(tmpHome, ".claude"), { recursive: true }); fs.mkdirSync(path.join(tmpHome, ".codex"), { recursive: true }); + // Detect via marker files so the test does not depend on `claude`/`codex` binaries on PATH. + fs.writeFileSync(path.join(tmpHome, ".claude", "settings.json"), "{}", "utf-8"); + fs.writeFileSync(path.join(tmpHome, ".codex", "config.toml"), "", "utf-8"); const installResult = Bun.spawnSync(["bash", path.join(repoRoot, "scripts", "install-skills.sh")], { cwd: repoRoot, @@ -791,6 +796,9 @@ describe("install scripts", () => { fs.mkdirSync(path.join(tmpHome, ".codex"), { recursive: true }); fs.mkdirSync(path.join(tmpHome, ".cursor"), { recursive: true }); fs.mkdirSync(path.join(tmpHome, ".agents"), { recursive: true }); + // Detect via marker files so the test does not depend on `claude`/`codex` binaries on PATH. + fs.writeFileSync(path.join(tmpHome, ".claude", "settings.json"), "{}", "utf-8"); + fs.writeFileSync(path.join(tmpHome, ".codex", "config.toml"), "", "utf-8"); const result = Bun.spawnSync(["bash", path.join(repoRoot, "scripts", "install-skills.sh")], { cwd: repoRoot, From fe95fbf773f402ecee574689d00435c0655871e4 Mon Sep 17 00:00:00 2001 From: Jay Zeng Date: Fri, 19 Jun 2026 23:30:11 -0700 Subject: [PATCH 7/7] fix: address Codex PR review (probe leak + a11y) - probeEmbeddings: abort the underlying qmd child via AbortSignal when the 4s timeout fires, so it no longer holds the event loop open until its own 60s timeout and hangs the CLI. - docs/index.html: drop aria-hidden from the hero badge wrapper; the badges are real focusable links with alt text and should be announced to AT. Co-Authored-By: Claude Opus 4.8 --- docs/index.html | 2 +- src/core.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/index.html b/docs/index.html index 8b9e92f..11099d0 100644 --- a/docs/index.html +++ b/docs/index.html @@ -475,7 +475,7 @@

    Stop losing context between sessions.

    Get Started View on GitHub -