github re-analysis due

pbmagnet4/nlm-memory

github

Local-first non-linear memory OS for AI operators. One index across Claude Code, Codex, Cursor, Windsurf, Hermes, OpenCode, Aider, pi, and more — with an editable timeline.

maintainer
pbmagnet4
license
Apache-2.0
first seen
2026-06-09
last seen
2026-06-16
releases · 30d
33
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio counts 0 tools · 0 res · 0 prompts permission surface via code analysis

no tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit dda6d28 · analyzer v17 · 3d ago

danger signals1

code evidence vv0.11.1 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

filesystem 66

  • fs pbmagnet4-nlm-memory-dda6d28/nlm/index.js :2 import { readFileSync, existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :18 import { appendFileSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :5 import { appendFileSync, mkdirSync as mkdirSync3 } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/build-codex-plugin.mjs :21 import { mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/classifier-eval.ts :25 import { readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :17 import { mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/signals-eval.ts :12 import { mkdtempSync, rmSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/extract-triples.mjs :37 import { createReadStream, existsSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/classifier-cache.ts :18 import { mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/compare-classifiers.ts :16 import { readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/embedding-cache.ts :15 import { mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/run-harness.ts :34 import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :11 import { existsSync, readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :30 import { mkdirSync, readFileSync, writeFileSync, existsSync, rmSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/aider.ts :20 import { existsSync, readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/claude-code.ts :16 import { promises as fs } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/codex.ts :25 import { promises as fs } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/cursor.ts :29 import { existsSync, readdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes-agent.ts :21 import { existsSync, readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes.ts :17 import { promises as fs, existsSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/jsonl-generic.ts :25 import { promises as fs, existsSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/opencode.ts :23 import { existsSync, readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/pi.ts :18 import { promises as fs, existsSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/windsurf.ts :29 import { existsSync, readdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/dataset/build-dataset.ts :11 import { existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-backfill.ts :20 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-normalize.ts :15 import { existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/facts/backfill-facts.ts :19 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/cite-memo.ts :19 import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/claude-settings.ts :9 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/hook-log.ts :12 import { appendFileSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/memo-sweep.ts :18 import { existsSync, readdirSync, rmSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/memo.ts :14 import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/transcript.ts :21 import { existsSync, readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall-facts/fact-query-log.ts :14 import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/citation-log.ts :11 import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/hook-recall-log.ts :14 import { readFile } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/miss-log.ts :12 import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/query-log.ts :12 import { appendFile, mkdir, readFile, stat } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/recent-log.ts :6 import { readFileSync, existsSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scan-once.ts :24 import { statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scheduler.ts :20 import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/signals/install-scope.ts :8 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/sources/source-registry.ts :17 import { existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/db-restore.ts :16 import { existsSync, renameSync, rmSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/live-status.ts :17 import { statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/migrate.ts :15 import { readFileSync, readdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-storage.ts :14 import { readFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-session-store.ts :15 import { existsSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/supersedence-log.ts :13 import { appendFile, mkdir, readFile } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/core/update-check/check.ts :23 import { readFile, writeFile, mkdir } from "node:fs/promises";
  • fs pbmagnet4-nlm-memory-dda6d28/src/hook/session-end-hook.ts :16 import { appendFileSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/hook/stop-hook.ts :16 import { appendFileSync, mkdirSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/http/app.ts :21 import { appendFileSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/claude-code.ts :11 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/codex.ts :32 } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/cursor.ts :10 import { existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/hermes-agent.ts :15 import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/hermes.ts :10 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/nlm-dir-perms.ts :14 import { chmodSync, existsSync, readdirSync, statSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :15 import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/pi.ts :24 import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/rules-content.ts :17 import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :13 import { existsSync, mkdirSync, writeFileSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/install/windsurf.ts :10 import { existsSync } from "node:fs";
  • fs pbmagnet4-nlm-memory-dda6d28/src/llm/env-autoload.ts :9 import { readFileSync, existsSync } from "node:fs";

shell / exec 6

  • shell pbmagnet4-nlm-memory-dda6d28/src/cli/launchctl-helpers.ts :9 import { execFileSync } from "node:child_process";
  • shell pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :31 import { execFileSync, spawn, spawnSync } from "node:child_process";
  • shell pbmagnet4-nlm-memory-dda6d28/src/install/codex.ts :26 import { spawnSync } from "node:child_process";
  • shell pbmagnet4-nlm-memory-dda6d28/src/install/hermes-agent.ts :18 import { spawnSync } from "node:child_process";
  • shell pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :18 import { spawnSync, spawn } from "node:child_process";
  • shell pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :14 import { execFileSync } from "node:child_process";

network 22

  • net pbmagnet4-nlm-memory-dda6d28/nlm/index.js :204 const res = await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :309 const res = await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :395 await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/scripts/eval/classifier-eval.ts :86 const res = await fetch(`${this.baseUrl.replace(/\/+$/, "")}/chat/completions`, {
  • net pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :57 const res = await fetch(`${opts.baseUrl.replace(/\/+$/, "")}/chat/completions`, {
  • net pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :97 const res = await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :981 const res = await fetch(`http://localhost:${p}/api/ui-bootstrap-nonce`, {
  • net pbmagnet4-nlm-memory-dda6d28/src/hook/recall-over-http.ts :43 const res = await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/src/hook/session-start-hook.ts :94 const res = await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/src/hook/stop-hook.ts :211 await fetch(url, {
  • net pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :81 const res = await fetch(`${baseUrl}/api/tags`, { signal: controller.signal });
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/components/SessionDrawer.tsx :65 fetch(`/api/session/${encodeURIComponent(sessionId)}`)
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/components/SupersedePalette.tsx :100 const r = await fetch(
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/components/UpdateBanner.tsx :47 const r = await fetch("/api/update-status");
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/actions.ts :17 const res = await fetch("/api/action", {
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/api.ts :32 const res = await fetch(path);
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/dataset.ts :117 const res = await fetch("/api/dataset");
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/registries.ts :131 const r = await fetch("/api/sources");
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Classifier.tsx :34 fetch("/api/classifier/info").then((r) => r.json() as Promise<ClassifierInfo>),
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Data.tsx :57 const r = await fetch("/api/data/stats");
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Providers.tsx :37 await fetch(`/api/providers/${row.id}`, {
  • net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Sources.tsx :36 await fetch(`/api/sources/${row.id}`, {

secrets 11

  • secrets pbmagnet4-nlm-memory-dda6d28/nlm/index.js :46 const token = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :151 const token = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :273 const token = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :126 const token = process.env["TELEGRAM_BOT_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :225 const hasMcpToken = Boolean(process.env["NLM_MCP_TOKEN"]);
  • secrets pbmagnet4-nlm-memory-dda6d28/src/core/providers/provider-registry.ts :188 const deepseekKey = process.env["DEEPSEEK_API_KEY"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/hook/hook-auth.ts :15 const token = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/http/app.ts :302 const token = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :268 const existing = process.env["NLM_MCP_TOKEN"];
  • secrets pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :358 if (token === process.env["NLM_MCP_TOKEN"] && token.length === 64) {
  • secrets pbmagnet4-nlm-memory-dda6d28/src/llm/deepseek-client.ts :73 const key = opts.apiKey ?? process.env["DEEPSEEK_API_KEY"];

database 28

  • db pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :14 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/scripts/extract-triples.mjs :42 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/classifier-cache.ts :15 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/embedding-cache.ts :12 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/cli/classify-parity.ts :17 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/actions/actions-log.ts :10 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/actions/overlay.ts :12 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/cursor.ts :32 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes-agent.ts :24 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/opencode.ts :26 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/windsurf.ts :32 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/dataset/build-dataset.ts :12 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-backfill.ts :23 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-normalize.ts :16 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/integrity/check-invariants.ts :20 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/providers/provider-registry.ts :16 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scan-once.ts :25 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/sources/source-registry.ts :20 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/db-restore.ts :15 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/migrate.ts :17 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-fact-store.ts :7 import type { Pool } from "pg";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-session-store.ts :9 import type { Pool } from "pg";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-signal-store.ts :6 import type { Pool } from "pg";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-storage.ts :13 import { Pool } from "pg";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-fact-store.ts :21 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-session-store.ts :17 import Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-signal-store.ts :7 import type Database from "better-sqlite3";
  • db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-storage.ts :17 import type Database from "better-sqlite3";

declared dependencies 27

  • @clack/prompts@^1.4.0
  • @hono/node-server@^2.0.3
  • @modelcontextprotocol/sdk@^1.29.0
  • @toon-format/toon@^2.3.0
  • better-sqlite3@^12.10.0
  • commander@^15.0.0
  • hono@^4.6.0
  • pg@^8.21.0
  • pgvector@^0.3.0
  • sqlite-vec@^0.1.6
  • yaml@^2.9.0
  • zod@^4.4.3
  • @types/better-sqlite3@^7.6.13
  • @types/node@^22.10.0
  • @types/pg@^8.20.0
  • @types/react@^19.2.17
  • @types/react-dom@^19.2.3
  • @vitejs/plugin-react@^6.0.2
  • esbuild@^0.28.0
  • react@^19.2.7
  • react-dom@^19.2.7
  • react-router-dom@^6.30.3
  • tsc-alias@^1.8.17
  • tsx@^4.19.0
  • typescript@^6.0.3
  • vite@^8.0.16
  • vitest@^4.1.8