pathmark 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/SECURITY.md +39 -0
  4. package/assets/pathmark-icon-v3-glyph.png +0 -0
  5. package/dist/chat.d.ts +6 -0
  6. package/dist/chat.js +169 -0
  7. package/dist/chat.js.map +1 -0
  8. package/dist/codex/capture.d.ts +12 -0
  9. package/dist/codex/capture.js +328 -0
  10. package/dist/codex/capture.js.map +1 -0
  11. package/dist/codex/cli.d.ts +1 -0
  12. package/dist/codex/cli.js +96 -0
  13. package/dist/codex/cli.js.map +1 -0
  14. package/dist/codex/config-file.d.ts +9 -0
  15. package/dist/codex/config-file.js +100 -0
  16. package/dist/codex/config-file.js.map +1 -0
  17. package/dist/codex/cursor.d.ts +11 -0
  18. package/dist/codex/cursor.js +35 -0
  19. package/dist/codex/cursor.js.map +1 -0
  20. package/dist/codex/hooks.d.ts +10 -0
  21. package/dist/codex/hooks.js +108 -0
  22. package/dist/codex/hooks.js.map +1 -0
  23. package/dist/codex/paths.d.ts +5 -0
  24. package/dist/codex/paths.js +29 -0
  25. package/dist/codex/paths.js.map +1 -0
  26. package/dist/codex/tool-summary.d.ts +5 -0
  27. package/dist/codex/tool-summary.js +223 -0
  28. package/dist/codex/tool-summary.js.map +1 -0
  29. package/dist/codex/transcript.d.ts +9 -0
  30. package/dist/codex/transcript.js +99 -0
  31. package/dist/codex/transcript.js.map +1 -0
  32. package/dist/config.d.ts +2 -0
  33. package/dist/config.js +40 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/format.d.ts +10 -0
  36. package/dist/format.js +48 -0
  37. package/dist/format.js.map +1 -0
  38. package/dist/ids.d.ts +1 -0
  39. package/dist/ids.js +6 -0
  40. package/dist/ids.js.map +1 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.js +27 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/mcp.d.ts +1 -0
  45. package/dist/mcp.js +130 -0
  46. package/dist/mcp.js.map +1 -0
  47. package/dist/redact.d.ts +5 -0
  48. package/dist/redact.js +36 -0
  49. package/dist/redact.js.map +1 -0
  50. package/dist/setup.d.ts +1 -0
  51. package/dist/setup.js +208 -0
  52. package/dist/setup.js.map +1 -0
  53. package/dist/store.d.ts +27 -0
  54. package/dist/store.js +174 -0
  55. package/dist/store.js.map +1 -0
  56. package/dist/types.d.ts +38 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/examples/claude_code.md +21 -0
  60. package/examples/claude_desktop_config.json +10 -0
  61. package/examples/codex.md +39 -0
  62. package/examples/cursor_mcp_config.json +10 -0
  63. package/examples/gemini_settings.json +12 -0
  64. package/examples/generic_mcp_config.json +12 -0
  65. package/examples/openai_compatible.env +8 -0
  66. package/examples/opencode.jsonc +13 -0
  67. package/package.json +66 -0
  68. package/scripts/import-honcho.mjs +243 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type PathmarkRecordKind = "memory" | "conclusion";
2
+ export interface PathmarkRecord {
3
+ id: string;
4
+ kind: PathmarkRecordKind;
5
+ text: string;
6
+ tags: string[];
7
+ source: string;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ deletedAt?: string;
11
+ }
12
+ export interface PathmarkRecordDraft {
13
+ id?: string;
14
+ kind: PathmarkRecordKind;
15
+ text: string;
16
+ tags?: string[];
17
+ source?: string;
18
+ createdAt?: string;
19
+ updatedAt?: string;
20
+ }
21
+ export interface PathmarkConfig {
22
+ storeDir: string;
23
+ memoryFile: string;
24
+ synthesisProvider: "client" | "command" | "codex" | "openai-compatible";
25
+ chatCommand?: string;
26
+ codexCommand: string;
27
+ codexModel?: string;
28
+ openaiBaseUrl: string;
29
+ openaiApiKey?: string;
30
+ openaiModel?: string;
31
+ chatTimeoutMs: number;
32
+ maxSearchResults: number;
33
+ }
34
+ export interface SearchResult {
35
+ record: PathmarkRecord;
36
+ score: number;
37
+ matchedTerms: string[];
38
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ # Claude Code Setup
2
+
3
+ Install:
4
+
5
+ ```bash
6
+ npm install -g pathmark
7
+ ```
8
+
9
+ Register the MCP server:
10
+
11
+ ```bash
12
+ claude mcp add pathmark -- pathmark
13
+ ```
14
+
15
+ Generate this snippet from the installed CLI:
16
+
17
+ ```bash
18
+ pathmark setup claude-code
19
+ ```
20
+
21
+ Use the same `PATHMARK_STORE_DIR` as your other harnesses when you want shared memory.
@@ -0,0 +1,10 @@
1
+ {
2
+ "mcpServers": {
3
+ "pathmark": {
4
+ "command": "pathmark",
5
+ "env": {
6
+ "PATHMARK_STORE_DIR": "~/.pathmark/memory"
7
+ }
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,39 @@
1
+ # Codex Setup
2
+
3
+ Install:
4
+
5
+ ```bash
6
+ npm install -g pathmark
7
+ ```
8
+
9
+ Register the MCP server:
10
+
11
+ ```bash
12
+ codex mcp add pathmark -- pathmark
13
+ ```
14
+
15
+ Enable Codex auto-capture hooks:
16
+
17
+ ```bash
18
+ pathmark codex install --replace-honcho
19
+ ```
20
+
21
+ Check status:
22
+
23
+ ```bash
24
+ pathmark codex status
25
+ ```
26
+
27
+ Optional local store override:
28
+
29
+ ```bash
30
+ codex mcp add pathmark --env PATHMARK_STORE_DIR=~/.pathmark/memory -- pathmark
31
+ ```
32
+
33
+ Use the MCP tools from Codex:
34
+
35
+ - `remember`
36
+ - `search_memory`
37
+ - `get_context`
38
+ - `create_conclusion`
39
+ - `ask_memory`
@@ -0,0 +1,10 @@
1
+ {
2
+ "mcpServers": {
3
+ "pathmark": {
4
+ "command": "pathmark",
5
+ "env": {
6
+ "PATHMARK_STORE_DIR": "~/.pathmark/memory"
7
+ }
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "pathmark": {
4
+ "command": "pathmark",
5
+ "args": [],
6
+ "env": {
7
+ "PATHMARK_STORE_DIR": "~/.pathmark/memory",
8
+ "PATHMARK_SYNTHESIS_PROVIDER": "client"
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "pathmark": {
4
+ "command": "pathmark",
5
+ "args": [],
6
+ "env": {
7
+ "PATHMARK_STORE_DIR": "~/.pathmark/memory",
8
+ "PATHMARK_SYNTHESIS_PROVIDER": "client"
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,8 @@
1
+ PATHMARK_STORE_DIR=~/.pathmark/memory
2
+ PATHMARK_SYNTHESIS_PROVIDER=openai-compatible
3
+ PATHMARK_OPENAI_BASE_URL=https://api.provider.example/v1
4
+ PATHMARK_OPENAI_API_KEY=
5
+ PATHMARK_OPENAI_MODEL=
6
+
7
+ # Works for Kimi, GLM/Z.ai, OpenRouter, LiteLLM, local gateways, and similar
8
+ # OpenAI-compatible /chat/completions providers.
@@ -0,0 +1,13 @@
1
+ {
2
+ "mcp": {
3
+ "pathmark": {
4
+ "type": "local",
5
+ "command": ["pathmark"],
6
+ "enabled": true,
7
+ "environment": {
8
+ "PATHMARK_STORE_DIR": "~/.pathmark/memory",
9
+ "PATHMARK_SYNTHESIS_PROVIDER": "client"
10
+ }
11
+ }
12
+ }
13
+ }
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "pathmark",
3
+ "version": "0.1.0",
4
+ "description": "Cross-harness local memory for Codex, Claude Code, opencode, Cursor, Gemini CLI, and other MCP-capable AI agents.",
5
+ "type": "module",
6
+ "bin": {
7
+ "pathmark": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "assets/pathmark-icon-v3-glyph.png",
12
+ "README.md",
13
+ "SECURITY.md",
14
+ "LICENSE",
15
+ "examples",
16
+ "scripts/import-honcho.mjs"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsx src/index.ts",
21
+ "smoke": "node scripts/smoke.mjs",
22
+ "test": "npm run build && npm run smoke && npm run test:setup && npm run test:codex-adapter",
23
+ "test:setup": "npm run build && node scripts/test-setup.mjs",
24
+ "test:codex-adapter": "npm run build && node scripts/test-codex-adapter.mjs",
25
+ "import:honcho": "node scripts/import-honcho.mjs",
26
+ "prepack": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "mcp",
30
+ "model-context-protocol",
31
+ "memory",
32
+ "local-first",
33
+ "codex",
34
+ "claude",
35
+ "claude-code",
36
+ "cursor",
37
+ "opencode",
38
+ "gemini",
39
+ "gemini-cli",
40
+ "kimi",
41
+ "glm",
42
+ "mcp-server"
43
+ ],
44
+ "author": "",
45
+ "license": "MIT",
46
+ "homepage": "https://github.com/hacksurvivor/pathmark#readme",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/hacksurvivor/pathmark.git"
50
+ },
51
+ "bugs": {
52
+ "url": "https://github.com/hacksurvivor/pathmark/issues"
53
+ },
54
+ "engines": {
55
+ "node": ">=20"
56
+ },
57
+ "dependencies": {
58
+ "@modelcontextprotocol/sdk": "^1.29.0",
59
+ "zod": "^3.25.76"
60
+ },
61
+ "devDependencies": {
62
+ "@types/node": "^22.19.0",
63
+ "tsx": "^4.20.6",
64
+ "typescript": "^5.9.3"
65
+ }
66
+ }
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env node
2
+ import { createHash } from "node:crypto";
3
+ import { mkdir, readFile, readdir, rename, stat, writeFile } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+
7
+ const DEFAULT_HONCHO_DIR = "~/.honcho/codex/local";
8
+ const DEFAULT_PATHMARK_DIR = "~/.pathmark/memory";
9
+
10
+ const args = parseArgs(process.argv.slice(2));
11
+ const honchoDir = expandHome(args["honcho-dir"] ?? process.env.HONCHO_STORE_DIR ?? DEFAULT_HONCHO_DIR);
12
+ const pathmarkDir = expandHome(args["pathmark-dir"] ?? process.env.PATHMARK_STORE_DIR ?? DEFAULT_PATHMARK_DIR);
13
+ const memoryFile = path.join(pathmarkDir, "memory.jsonl");
14
+ const dryRun = Boolean(args["dry-run"]);
15
+ const noBackup = Boolean(args["no-backup"]);
16
+
17
+ const stats = {
18
+ conclusionsRead: 0,
19
+ sessionsRead: 0,
20
+ recordsPrepared: 0,
21
+ duplicatesSkipped: 0,
22
+ invalidLinesSkipped: 0,
23
+ emptySkipped: 0,
24
+ redactedRecords: 0,
25
+ written: 0,
26
+ };
27
+
28
+ await assertDirectory(honchoDir, "Honcho store");
29
+ await mkdir(pathmarkDir, { recursive: true });
30
+ await ensureFile(memoryFile);
31
+
32
+ const existingRecords = await readJsonl(memoryFile);
33
+ const existingIds = new Set(existingRecords.records.map((record) => record.id));
34
+ const imported = [];
35
+
36
+ await importConclusions();
37
+ await importSessions();
38
+
39
+ const newRecords = imported.filter((record) => {
40
+ if (existingIds.has(record.id)) {
41
+ stats.duplicatesSkipped += 1;
42
+ return false;
43
+ }
44
+ existingIds.add(record.id);
45
+ return true;
46
+ });
47
+
48
+ stats.written = newRecords.length;
49
+
50
+ if (!dryRun && newRecords.length > 0) {
51
+ if (!noBackup) {
52
+ const backupFile = path.join(pathmarkDir, `memory.jsonl.backup-${timestamp()}`);
53
+ await writeFile(backupFile, await readFile(memoryFile, "utf8"), "utf8");
54
+ }
55
+
56
+ const body = [...existingRecords.records, ...newRecords].map((record) => JSON.stringify(record)).join("\n");
57
+ const tmp = path.join(pathmarkDir, `.memory.import-honcho.${Date.now()}.tmp`);
58
+ await writeFile(tmp, body ? `${body}\n` : "", "utf8");
59
+ await rename(tmp, memoryFile);
60
+ }
61
+
62
+ console.log(
63
+ JSON.stringify(
64
+ {
65
+ honchoDir,
66
+ pathmarkDir,
67
+ memoryFile,
68
+ dryRun,
69
+ ...stats,
70
+ existingPathmarkRecords: existingRecords.records.length,
71
+ parseErrorsInExistingPathmark: existingRecords.invalidLines,
72
+ },
73
+ null,
74
+ 2,
75
+ ),
76
+ );
77
+
78
+ async function importConclusions() {
79
+ const file = path.join(honchoDir, "conclusions.jsonl");
80
+ if (!(await exists(file))) return;
81
+
82
+ const parsed = await readJsonl(file);
83
+ stats.invalidLinesSkipped += parsed.invalidLines;
84
+
85
+ for (const raw of parsed.records) {
86
+ stats.conclusionsRead += 1;
87
+ const text = String(raw.text ?? "").trim();
88
+ if (!text) {
89
+ stats.emptySkipped += 1;
90
+ continue;
91
+ }
92
+
93
+ const redacted = redact(text);
94
+ if (redacted.changed) stats.redactedRecords += 1;
95
+
96
+ imported.push({
97
+ id: deterministicId(`honcho:conclusion:${raw.id ?? text}`),
98
+ kind: "conclusion",
99
+ text: redacted.text,
100
+ tags: ["honcho-conclusion", "honcho-import"],
101
+ source: "honcho:conclusions",
102
+ createdAt: isoDate(raw.createdAt),
103
+ updatedAt: isoDate(raw.createdAt),
104
+ });
105
+ stats.recordsPrepared += 1;
106
+ }
107
+ }
108
+
109
+ async function importSessions() {
110
+ const sessionsDir = path.join(honchoDir, "sessions");
111
+ if (!(await exists(sessionsDir))) return;
112
+
113
+ const files = (await readdir(sessionsDir)).filter((file) => file.endsWith(".jsonl")).sort();
114
+ for (const fileName of files) {
115
+ const file = path.join(sessionsDir, fileName);
116
+ const parsed = await readJsonl(file);
117
+ stats.invalidLinesSkipped += parsed.invalidLines;
118
+
119
+ for (const [index, raw] of parsed.records.entries()) {
120
+ stats.sessionsRead += 1;
121
+ const text = String(raw.text ?? "").trim();
122
+ if (!text) {
123
+ stats.emptySkipped += 1;
124
+ continue;
125
+ }
126
+
127
+ const session = String(raw.session ?? path.basename(fileName, ".jsonl"));
128
+ const role = normalizeRole(raw.role);
129
+ const redacted = redact(text);
130
+ if (redacted.changed) stats.redactedRecords += 1;
131
+
132
+ imported.push({
133
+ id: deterministicId(`honcho:session:${session}:${index}:${role}:${text}`),
134
+ kind: "memory",
135
+ text: redacted.text,
136
+ tags: ["honcho-import", "honcho-session", `role-${role}`],
137
+ source: `honcho:session:${session}`,
138
+ createdAt: isoDate(raw.at),
139
+ updatedAt: isoDate(raw.at),
140
+ });
141
+ stats.recordsPrepared += 1;
142
+ }
143
+ }
144
+ }
145
+
146
+ async function readJsonl(file) {
147
+ const raw = await readFile(file, "utf8");
148
+ const records = [];
149
+ let invalidLines = 0;
150
+
151
+ for (const line of raw.split("\n")) {
152
+ if (!line.trim()) continue;
153
+ try {
154
+ records.push(JSON.parse(line));
155
+ } catch {
156
+ invalidLines += 1;
157
+ }
158
+ }
159
+
160
+ return { records, invalidLines };
161
+ }
162
+
163
+ async function assertDirectory(dir, label) {
164
+ const info = await stat(dir).catch(() => undefined);
165
+ if (!info?.isDirectory()) {
166
+ throw new Error(`${label} not found or not a directory: ${dir}`);
167
+ }
168
+ }
169
+
170
+ async function ensureFile(file) {
171
+ if (await exists(file)) return;
172
+ await writeFile(file, "", "utf8");
173
+ }
174
+
175
+ async function exists(file) {
176
+ try {
177
+ await stat(file);
178
+ return true;
179
+ } catch {
180
+ return false;
181
+ }
182
+ }
183
+
184
+ function parseArgs(argv) {
185
+ const parsed = {};
186
+ for (let index = 0; index < argv.length; index += 1) {
187
+ const arg = argv[index];
188
+ if (!arg.startsWith("--")) continue;
189
+ const key = arg.slice(2);
190
+ const next = argv[index + 1];
191
+ if (!next || next.startsWith("--")) {
192
+ parsed[key] = true;
193
+ continue;
194
+ }
195
+ parsed[key] = next;
196
+ index += 1;
197
+ }
198
+ return parsed;
199
+ }
200
+
201
+ function expandHome(value) {
202
+ if (value === "~") return os.homedir();
203
+ if (value.startsWith("~/")) return path.join(os.homedir(), value.slice(2));
204
+ return value;
205
+ }
206
+
207
+ function deterministicId(value) {
208
+ const hash = createHash("sha256").update(value).digest("hex");
209
+ return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
210
+ }
211
+
212
+ function isoDate(value) {
213
+ const date = value ? new Date(value) : new Date();
214
+ if (Number.isNaN(date.getTime())) return new Date().toISOString();
215
+ return date.toISOString();
216
+ }
217
+
218
+ function normalizeRole(value) {
219
+ return String(value ?? "unknown")
220
+ .toLowerCase()
221
+ .replace(/[^a-z0-9_-]+/g, "-")
222
+ .replace(/^-+|-+$/g, "")
223
+ .slice(0, 40) || "unknown";
224
+ }
225
+
226
+ function redact(text) {
227
+ let changed = false;
228
+ const redacted = text
229
+ .replace(/\b([A-Z0-9_]*(?:API[_-]?KEY|SECRET|TOKEN|PASSWORD|PRIVATE[_-]?KEY)[A-Z0-9_]*)\s*[:=]\s*(['"]?)([^\s'",}]{8,})\2/gi, (_match, name) => {
230
+ changed = true;
231
+ return `${name}=[REDACTED]`;
232
+ })
233
+ .replace(/\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/g, () => {
234
+ changed = true;
235
+ return "Bearer [REDACTED]";
236
+ });
237
+
238
+ return { text: redacted, changed };
239
+ }
240
+
241
+ function timestamp() {
242
+ return new Date().toISOString().replace(/[:.]/g, "-");
243
+ }