@waynesutton/agent-memory 0.0.1

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 (201) hide show
  1. package/.claude/settings.json +9 -0
  2. package/.claude/settings.local.json +7 -0
  3. package/AGENTS.md +113 -0
  4. package/CLAUDE.md +79 -0
  5. package/README.md +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +192 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/parsers/claude-code.d.ts +3 -0
  11. package/dist/cli/parsers/claude-code.d.ts.map +1 -0
  12. package/dist/cli/parsers/claude-code.js +75 -0
  13. package/dist/cli/parsers/claude-code.js.map +1 -0
  14. package/dist/cli/parsers/codex.d.ts +3 -0
  15. package/dist/cli/parsers/codex.d.ts.map +1 -0
  16. package/dist/cli/parsers/codex.js +42 -0
  17. package/dist/cli/parsers/codex.js.map +1 -0
  18. package/dist/cli/parsers/conductor.d.ts +3 -0
  19. package/dist/cli/parsers/conductor.d.ts.map +1 -0
  20. package/dist/cli/parsers/conductor.js +43 -0
  21. package/dist/cli/parsers/conductor.js.map +1 -0
  22. package/dist/cli/parsers/cursor.d.ts +3 -0
  23. package/dist/cli/parsers/cursor.d.ts.map +1 -0
  24. package/dist/cli/parsers/cursor.js +50 -0
  25. package/dist/cli/parsers/cursor.js.map +1 -0
  26. package/dist/cli/parsers/index.d.ts +12 -0
  27. package/dist/cli/parsers/index.d.ts.map +1 -0
  28. package/dist/cli/parsers/index.js +27 -0
  29. package/dist/cli/parsers/index.js.map +1 -0
  30. package/dist/cli/parsers/opencode.d.ts +3 -0
  31. package/dist/cli/parsers/opencode.d.ts.map +1 -0
  32. package/dist/cli/parsers/opencode.js +72 -0
  33. package/dist/cli/parsers/opencode.js.map +1 -0
  34. package/dist/cli/parsers/parsers.test.d.ts +2 -0
  35. package/dist/cli/parsers/parsers.test.d.ts.map +1 -0
  36. package/dist/cli/parsers/parsers.test.js +151 -0
  37. package/dist/cli/parsers/parsers.test.js.map +1 -0
  38. package/dist/cli/parsers/pi.d.ts +3 -0
  39. package/dist/cli/parsers/pi.d.ts.map +1 -0
  40. package/dist/cli/parsers/pi.js +43 -0
  41. package/dist/cli/parsers/pi.js.map +1 -0
  42. package/dist/cli/parsers/types.d.ts +25 -0
  43. package/dist/cli/parsers/types.d.ts.map +1 -0
  44. package/dist/cli/parsers/types.js +2 -0
  45. package/dist/cli/parsers/types.js.map +1 -0
  46. package/dist/cli/parsers/vscode-copilot.d.ts +3 -0
  47. package/dist/cli/parsers/vscode-copilot.d.ts.map +1 -0
  48. package/dist/cli/parsers/vscode-copilot.js +69 -0
  49. package/dist/cli/parsers/vscode-copilot.js.map +1 -0
  50. package/dist/cli/parsers/zed.d.ts +3 -0
  51. package/dist/cli/parsers/zed.d.ts.map +1 -0
  52. package/dist/cli/parsers/zed.js +43 -0
  53. package/dist/cli/parsers/zed.js.map +1 -0
  54. package/dist/cli/sync.d.ts +21 -0
  55. package/dist/cli/sync.d.ts.map +1 -0
  56. package/dist/cli/sync.js +78 -0
  57. package/dist/cli/sync.js.map +1 -0
  58. package/dist/cli/type-extractor.d.ts +25 -0
  59. package/dist/cli/type-extractor.d.ts.map +1 -0
  60. package/dist/cli/type-extractor.js +254 -0
  61. package/dist/cli/type-extractor.js.map +1 -0
  62. package/dist/cli/type-extractor.test.d.ts +2 -0
  63. package/dist/cli/type-extractor.test.d.ts.map +1 -0
  64. package/dist/cli/type-extractor.test.js +173 -0
  65. package/dist/cli/type-extractor.test.js.map +1 -0
  66. package/dist/client/http.d.ts +44 -0
  67. package/dist/client/http.d.ts.map +1 -0
  68. package/dist/client/http.js +311 -0
  69. package/dist/client/http.js.map +1 -0
  70. package/dist/client/index.d.ts +158 -0
  71. package/dist/client/index.d.ts.map +1 -0
  72. package/dist/client/index.js +256 -0
  73. package/dist/client/index.js.map +1 -0
  74. package/dist/component/_generated/api.d.ts +12 -0
  75. package/dist/component/_generated/api.d.ts.map +1 -0
  76. package/dist/component/_generated/api.js +13 -0
  77. package/dist/component/_generated/api.js.map +1 -0
  78. package/dist/component/_generated/dataModel.d.ts +18 -0
  79. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  80. package/dist/component/_generated/dataModel.js +11 -0
  81. package/dist/component/_generated/dataModel.js.map +1 -0
  82. package/dist/component/_generated/server.d.ts +42 -0
  83. package/dist/component/_generated/server.d.ts.map +1 -0
  84. package/dist/component/_generated/server.js +39 -0
  85. package/dist/component/_generated/server.js.map +1 -0
  86. package/dist/component/actions.d.ts +42 -0
  87. package/dist/component/actions.d.ts.map +1 -0
  88. package/dist/component/actions.js +405 -0
  89. package/dist/component/actions.js.map +1 -0
  90. package/dist/component/apiKeyMutations.d.ts +29 -0
  91. package/dist/component/apiKeyMutations.d.ts.map +1 -0
  92. package/dist/component/apiKeyMutations.js +149 -0
  93. package/dist/component/apiKeyMutations.js.map +1 -0
  94. package/dist/component/apiKeyQueries.d.ts +37 -0
  95. package/dist/component/apiKeyQueries.d.ts.map +1 -0
  96. package/dist/component/apiKeyQueries.js +127 -0
  97. package/dist/component/apiKeyQueries.js.map +1 -0
  98. package/dist/component/checksum.d.ts +6 -0
  99. package/dist/component/checksum.d.ts.map +1 -0
  100. package/dist/component/checksum.js +14 -0
  101. package/dist/component/checksum.js.map +1 -0
  102. package/dist/component/checksum.test.d.ts +2 -0
  103. package/dist/component/checksum.test.d.ts.map +1 -0
  104. package/dist/component/checksum.test.js +27 -0
  105. package/dist/component/checksum.test.js.map +1 -0
  106. package/dist/component/convex.config.d.ts +3 -0
  107. package/dist/component/convex.config.d.ts.map +1 -0
  108. package/dist/component/convex.config.js +4 -0
  109. package/dist/component/convex.config.js.map +1 -0
  110. package/dist/component/cronActions.d.ts +3 -0
  111. package/dist/component/cronActions.d.ts.map +1 -0
  112. package/dist/component/cronActions.js +38 -0
  113. package/dist/component/cronActions.js.map +1 -0
  114. package/dist/component/cronQueries.d.ts +6 -0
  115. package/dist/component/cronQueries.d.ts.map +1 -0
  116. package/dist/component/cronQueries.js +38 -0
  117. package/dist/component/cronQueries.js.map +1 -0
  118. package/dist/component/crons.d.ts +3 -0
  119. package/dist/component/crons.d.ts.map +1 -0
  120. package/dist/component/crons.js +18 -0
  121. package/dist/component/crons.js.map +1 -0
  122. package/dist/component/format.d.ts +11 -0
  123. package/dist/component/format.d.ts.map +1 -0
  124. package/dist/component/format.js +175 -0
  125. package/dist/component/format.js.map +1 -0
  126. package/dist/component/format.test.d.ts +2 -0
  127. package/dist/component/format.test.d.ts.map +1 -0
  128. package/dist/component/format.test.js +118 -0
  129. package/dist/component/format.test.js.map +1 -0
  130. package/dist/component/mutations.d.ts +158 -0
  131. package/dist/component/mutations.d.ts.map +1 -0
  132. package/dist/component/mutations.js +745 -0
  133. package/dist/component/mutations.js.map +1 -0
  134. package/dist/component/queries.d.ts +94 -0
  135. package/dist/component/queries.d.ts.map +1 -0
  136. package/dist/component/queries.js +574 -0
  137. package/dist/component/queries.js.map +1 -0
  138. package/dist/component/schema.d.ts +278 -0
  139. package/dist/component/schema.d.ts.map +1 -0
  140. package/dist/component/schema.js +161 -0
  141. package/dist/component/schema.js.map +1 -0
  142. package/dist/mcp/server.d.ts +11 -0
  143. package/dist/mcp/server.d.ts.map +1 -0
  144. package/dist/mcp/server.js +571 -0
  145. package/dist/mcp/server.js.map +1 -0
  146. package/dist/shared.d.ts +126 -0
  147. package/dist/shared.d.ts.map +1 -0
  148. package/dist/shared.js +67 -0
  149. package/dist/shared.js.map +1 -0
  150. package/dist/test.d.ts +23 -0
  151. package/dist/test.d.ts.map +1 -0
  152. package/dist/test.js +21 -0
  153. package/dist/test.js.map +1 -0
  154. package/eslint.config.js +15 -0
  155. package/example/convex/convex.config.ts +7 -0
  156. package/example/convex/memory.ts +129 -0
  157. package/llms.md +175 -0
  158. package/llms.txt +126 -0
  159. package/package.json +72 -0
  160. package/prds/API-REFERENCE.md +935 -0
  161. package/prds/README.md +988 -0
  162. package/prds/SETUP.md +682 -0
  163. package/src/cli/index.ts +254 -0
  164. package/src/cli/parsers/claude-code.ts +80 -0
  165. package/src/cli/parsers/codex.ts +45 -0
  166. package/src/cli/parsers/conductor.ts +47 -0
  167. package/src/cli/parsers/cursor.ts +55 -0
  168. package/src/cli/parsers/index.ts +30 -0
  169. package/src/cli/parsers/opencode.ts +84 -0
  170. package/src/cli/parsers/parsers.test.ts +201 -0
  171. package/src/cli/parsers/pi.ts +47 -0
  172. package/src/cli/parsers/types.ts +26 -0
  173. package/src/cli/parsers/vscode-copilot.ts +78 -0
  174. package/src/cli/parsers/zed.ts +47 -0
  175. package/src/cli/sync.ts +110 -0
  176. package/src/cli/type-extractor.test.ts +241 -0
  177. package/src/cli/type-extractor.ts +331 -0
  178. package/src/client/http.ts +415 -0
  179. package/src/client/index.ts +519 -0
  180. package/src/component/_generated/api.ts +14 -0
  181. package/src/component/_generated/dataModel.ts +20 -0
  182. package/src/component/_generated/server.ts +64 -0
  183. package/src/component/actions.ts +558 -0
  184. package/src/component/apiKeyMutations.ts +175 -0
  185. package/src/component/apiKeyQueries.ts +156 -0
  186. package/src/component/checksum.test.ts +31 -0
  187. package/src/component/checksum.ts +13 -0
  188. package/src/component/convex.config.ts +5 -0
  189. package/src/component/cronActions.ts +52 -0
  190. package/src/component/cronQueries.ts +42 -0
  191. package/src/component/crons.ts +34 -0
  192. package/src/component/format.test.ts +133 -0
  193. package/src/component/format.ts +232 -0
  194. package/src/component/mutations.ts +824 -0
  195. package/src/component/queries.ts +684 -0
  196. package/src/component/schema.ts +207 -0
  197. package/src/mcp/server.ts +695 -0
  198. package/src/shared.ts +251 -0
  199. package/src/test.ts +32 -0
  200. package/tsconfig.json +21 -0
  201. package/vitest.config.ts +8 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Read(//Users/waynesutton/Documents/sites/**)",
5
+ "WebFetch(domain:michaellivs.com)",
6
+ "WebSearch"
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "WebFetch(domain:docs.convex.dev)"
5
+ ]
6
+ }
7
+ }
package/AGENTS.md ADDED
@@ -0,0 +1,113 @@
1
+ # Agent Instructions — @waynesutton/agent-memory
2
+
3
+ ## Project Overview
4
+
5
+ This is a Convex Component npm package (`@waynesutton/agent-memory`) that provides persistent, cloud-synced memory for AI coding agents. It is not a standalone app — it is installed into other Convex apps via `app.use(agentMemory)`.
6
+
7
+ ## Tech Stack
8
+
9
+ - **Runtime:** Convex (serverless backend)
10
+ - **Language:** TypeScript (strict mode)
11
+ - **Build:** `tsc` (no bundler)
12
+ - **Test:** Vitest + convex-test
13
+ - **Package manager:** npm
14
+
15
+ ## Project Structure
16
+
17
+ ```
18
+ src/
19
+ ├── component/ # Convex backend (defineComponent)
20
+ │ ├── schema.ts # 9 tables with validators and indexes
21
+ │ ├── mutations.ts # CRUD + batch + feedback + relations + history
22
+ │ ├── queries.ts # list, search, context bundle, history, feedback
23
+ │ ├── actions.ts # embeddings, semantic search, intelligent ingest
24
+ │ ├── apiKeyMutations.ts # API key create/revoke, rate limit
25
+ │ ├── apiKeyQueries.ts # API key validation
26
+ │ ├── crons.ts # Scheduled jobs (decay, cleanup)
27
+ │ ├── cronActions.ts # Internal actions for crons
28
+ │ ├── cronQueries.ts # Internal queries for crons
29
+ │ ├── format.ts # Memory -> tool-native file conversion
30
+ │ └── checksum.ts # FNV-1a hashing
31
+ ├── client/
32
+ │ ├── index.ts # AgentMemory class (public API)
33
+ │ └── http.ts # MemoryHttpApi class (HTTP endpoints)
34
+ ├── mcp/
35
+ │ └── server.ts # MCP server (14 tools)
36
+ ├── cli/
37
+ │ ├── index.ts # CLI entry point
38
+ │ ├── sync.ts # Push/pull logic
39
+ │ └── parsers/ # 8 tool format parsers
40
+ ├── shared.ts # Shared types and validators
41
+ └── test.ts # Test helper
42
+ ```
43
+
44
+ ## Development Commands
45
+
46
+ ```bash
47
+ npm run build # tsc compile
48
+ npm run dev # tsc --watch
49
+ npm test # vitest run
50
+ npm run test:watch # vitest watch
51
+ npm run codegen # convex codegen for component
52
+ ```
53
+
54
+ ## Coding Conventions
55
+
56
+ ### Convex Component Rules
57
+
58
+ 1. **All public functions must have `args` and `returns` validators** — Convex components require explicit validators on every exported query, mutation, and action.
59
+ 2. **No `ctx.auth`** — components cannot access the consuming app's auth. Identity is passed explicitly via `userId`, `agentId`, etc.
60
+ 3. **No `process.env`** — components cannot read environment variables. Config values like API keys are passed as function arguments.
61
+ 4. **IDs become strings at the boundary** — when the consuming app calls component functions, Convex `Id<"table">` values cross as strings. Cast with `as any` at boundaries.
62
+ 5. **Use `(q: any)` for index queries** — TypeScript struggles with component-internal index types. Use `any` for `.withIndex()` callback parameters.
63
+ 6. **Component tables are isolated** — the 9 tables live under the `agentMemory:` namespace, separate from the consuming app's tables.
64
+
65
+ ### TypeScript
66
+
67
+ - Strict mode enabled
68
+ - Use `import type` for type-only imports
69
+ - Use `.js` extensions in import paths (ESM)
70
+ - Prefer `as const` for literal arrays used as validators
71
+
72
+ ### Style
73
+
74
+ - Functions use explicit return types where validators require it
75
+ - Mutations that modify state always record history entries
76
+ - Checksums use FNV-1a (see `src/component/checksum.ts`)
77
+ - All timestamps are `Date.now()` (milliseconds)
78
+
79
+ ## Key Patterns
80
+
81
+ ### Adding a new query/mutation to the component
82
+
83
+ 1. Add the function to `src/component/queries.ts` or `src/component/mutations.ts`
84
+ 2. Include full `args` and `returns` validators
85
+ 3. Add a wrapper method to `src/client/index.ts` (AgentMemory class)
86
+ 4. If MCP-accessible, add a tool definition to `src/mcp/server.ts`
87
+ 5. Update `src/shared.ts` if new types are needed
88
+
89
+ ### The context bundle pattern
90
+
91
+ `getContextBundle` returns memories in 3 tiers:
92
+ - **pinned** — effective priority >= 0.8 (boosted by positive feedback)
93
+ - **relevant** — path-matched against `activePaths`
94
+ - **available** — everything else as summaries
95
+
96
+ Priority is computed by `getEffectivePriority()` which factors in `positiveCount` and `negativeCount`.
97
+
98
+ ### The intelligent ingest pipeline
99
+
100
+ `actions.ingest` does: extract facts (LLM) -> search existing (full-text) -> decide per-fact (LLM) -> execute ADD/UPDATE/DELETE/SKIP.
101
+
102
+ ## Testing
103
+
104
+ Tests use `convex-test` with Vitest. The component exports a test helper at `@waynesutton/agent-memory/test`.
105
+
106
+ ## Documentation
107
+
108
+ - `prds/README.md` — user-facing README
109
+ - `prds/API-REFERENCE.md` — complete API reference
110
+ - `prds/SETUP.md` — step-by-step setup guide
111
+ - `llms.txt` — concise reference for LLMs
112
+ - `llms.md` — detailed agent reference
113
+ - `CLAUDE.md` — Claude Code specific instructions
package/CLAUDE.md ADDED
@@ -0,0 +1,79 @@
1
+ # CLAUDE.md — @waynesutton/agent-memory
2
+
3
+ ## What This Project Is
4
+
5
+ A Convex Component npm package that provides persistent, cloud-synced memory for AI coding agents. Installed into Convex apps via `app.use(agentMemory)`. Not a standalone app.
6
+
7
+ ## Build & Test
8
+
9
+ ```bash
10
+ npm run build # tsc
11
+ npm test # vitest run
12
+ npm run codegen # convex codegen --component-dir ./src/component
13
+ ```
14
+
15
+ ## Key Files
16
+
17
+ - `src/component/schema.ts` — 9 tables (memories, embeddings, projects, syncLog, memoryHistory, memoryFeedback, memoryRelations, apiKeys, rateLimitTokens)
18
+ - `src/component/mutations.ts` — all write operations with history tracking
19
+ - `src/component/queries.ts` — all read operations
20
+ - `src/component/actions.ts` — embeddings, semantic search, intelligent ingest
21
+ - `src/component/apiKeyMutations.ts` — API key CRUD and rate limiting
22
+ - `src/component/apiKeyQueries.ts` — API key validation
23
+ - `src/client/index.ts` — `AgentMemory` class (the public API consumers use)
24
+ - `src/client/http.ts` — `MemoryHttpApi` class (read-only HTTP endpoints)
25
+ - `src/mcp/server.ts` — MCP server with 14 tools
26
+ - `src/shared.ts` — shared types and validators (used by both component and client)
27
+ - `src/component/crons.ts` — scheduled jobs (relevance decay, cleanup)
28
+
29
+ ## Convex Component Rules (IMPORTANT)
30
+
31
+ These rules are non-negotiable when modifying this codebase:
32
+
33
+ 1. **Every exported query/mutation/action must have `args` and `returns` validators.** This is a Convex component requirement. Missing validators will cause deployment failures.
34
+
35
+ 2. **No `ctx.auth` inside `src/component/`.** Components don't have access to the consuming app's auth system. User identity is passed explicitly as string args (`userId`, `agentId`).
36
+
37
+ 3. **No `process.env` inside `src/component/`.** Components run in an isolated environment. API keys and config must be passed as function arguments.
38
+
39
+ 4. **IDs are strings at the component boundary.** When the consuming app calls component functions, `Id<"memories">` becomes `string`. Use `as any` or `as unknown as string` at boundaries.
40
+
41
+ 5. **Use `(q: any)` in `.withIndex()` callbacks.** The generated types for component indexes don't resolve cleanly — use `any` for the query builder parameter.
42
+
43
+ 6. **Import paths use `.js` extensions.** This is ESM. Write `import { foo } from "./bar.js"` not `"./bar"`.
44
+
45
+ 7. **Mutations that change content must record history.** Every create/update/archive/restore writes to the `memoryHistory` table for audit trail.
46
+
47
+ ## Code Style
48
+
49
+ - TypeScript strict mode
50
+ - No bundler — plain `tsc` output
51
+ - Prefer `as const` arrays for validator source-of-truth
52
+ - Timestamps are always `Date.now()` (milliseconds)
53
+ - Checksums use FNV-1a (`src/component/checksum.ts`)
54
+ - No unnecessary abstractions — three similar lines > premature helper
55
+
56
+ ## Architecture Notes
57
+
58
+ - The `AgentMemory` class in `src/client/index.ts` wraps all component function calls. Consumers never call component functions directly in practice.
59
+ - The `MemoryHttpApi` class in `src/client/http.ts` generates `httpAction` handlers. It cannot create HTTP routes directly (Convex component limitation) — the consuming app mounts them.
60
+ - The MCP server (`src/mcp/server.ts`) runs as a local process using stdio, not as a Convex function. It uses `ConvexHttpClient` to talk to the backend.
61
+ - Cron jobs are defined in `src/component/crons.ts` and call internal actions/mutations. They run inside the component's isolated environment.
62
+ - The intelligent ingest pipeline (`actions.ingest`) calls an external LLM API from within a Convex action. It extracts facts, searches for overlap, and decides ADD/UPDATE/DELETE/SKIP per fact.
63
+
64
+ ## When Adding Features
65
+
66
+ 1. Start with the schema if new tables/fields are needed (`src/component/schema.ts`)
67
+ 2. Add component functions (queries/mutations/actions in `src/component/`)
68
+ 3. Add client wrapper methods (`src/client/index.ts`)
69
+ 4. Add MCP tool if agent-accessible (`src/mcp/server.ts`)
70
+ 5. Add types to `src/shared.ts` if needed
71
+ 6. Update docs: `prds/API-REFERENCE.md`, `prds/README.md`, `prds/SETUP.md`
72
+ 7. Run `npm run build` to verify — zero TypeScript errors required
73
+
74
+ ## Docs Location
75
+
76
+ User-facing docs are in `prds/` (not the project root):
77
+ - `prds/README.md` — full README
78
+ - `prds/API-REFERENCE.md` — complete API reference
79
+ - `prds/SETUP.md` — setup guide with all integration paths (A through H)
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # agent-memory
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { push, pull, detectTools } from "./sync.js";
4
+ import { extractTypeMemories } from "./type-extractor.js";
5
+ import { ConvexHttpClient } from "convex/browser";
6
+ const program = new Command();
7
+ program
8
+ .name("agent-memory")
9
+ .description("CLI for syncing agent memories between local files and Convex")
10
+ .version("0.0.1");
11
+ // ── init ────────────────────────────────────────────────────────────
12
+ program
13
+ .command("init")
14
+ .description("Detect tools and register project")
15
+ .option("--project <id>", "Project ID", "default")
16
+ .option("--name <name>", "Project display name")
17
+ .action(async (opts) => {
18
+ const convexUrl = requireConvexUrl();
19
+ const dir = process.cwd();
20
+ console.log("Detecting tools...");
21
+ const tools = await detectTools(dir);
22
+ if (tools.length === 0) {
23
+ console.log("No tool configurations detected. Supported: Claude Code, Cursor, OpenCode, Codex, Conductor, Zed, VS Code Copilot, Pi");
24
+ }
25
+ else {
26
+ console.log(`Found: ${tools.join(", ")}`);
27
+ }
28
+ const client = new ConvexHttpClient(convexUrl);
29
+ await client.mutation("agentMemory/mutations:upsertProject", {
30
+ projectId: opts.project,
31
+ name: opts.name ?? opts.project,
32
+ settings: {
33
+ autoSync: false,
34
+ syncFormats: tools,
35
+ },
36
+ });
37
+ console.log(`Project "${opts.project}" registered.`);
38
+ });
39
+ // ── push ────────────────────────────────────────────────────────────
40
+ program
41
+ .command("push")
42
+ .description("Push local memory files to Convex")
43
+ .option("--project <id>", "Project ID", "default")
44
+ .option("--format <format>", "Tool format to parse")
45
+ .option("--user <id>", "User ID for user-scoped memories")
46
+ .action(async (opts) => {
47
+ const convexUrl = requireConvexUrl();
48
+ console.log("Pushing local memories to Convex...");
49
+ await push({
50
+ convexUrl,
51
+ projectId: opts.project,
52
+ format: opts.format,
53
+ userId: opts.user,
54
+ dir: process.cwd(),
55
+ });
56
+ });
57
+ // ── pull ────────────────────────────────────────────────────────────
58
+ program
59
+ .command("pull")
60
+ .description("Pull memories from Convex to local files")
61
+ .option("--project <id>", "Project ID", "default")
62
+ .option("--format <format>", "Output format", "raw")
63
+ .option("--user <id>", "User ID for user-scoped memories")
64
+ .action(async (opts) => {
65
+ const convexUrl = requireConvexUrl();
66
+ console.log("Pulling memories from Convex...");
67
+ await pull({
68
+ convexUrl,
69
+ projectId: opts.project,
70
+ format: opts.format,
71
+ userId: opts.user,
72
+ dir: process.cwd(),
73
+ });
74
+ });
75
+ // ── list ────────────────────────────────────────────────────────────
76
+ program
77
+ .command("list")
78
+ .description("List memories in the terminal")
79
+ .option("--project <id>", "Project ID", "default")
80
+ .option("--type <type>", "Filter by memory type")
81
+ .action(async (opts) => {
82
+ const convexUrl = requireConvexUrl();
83
+ const client = new ConvexHttpClient(convexUrl);
84
+ const memories = await client.query("agentMemory/queries:list", {
85
+ projectId: opts.project,
86
+ memoryType: opts.type,
87
+ archived: false,
88
+ });
89
+ if (memories.length === 0) {
90
+ console.log("No memories found.");
91
+ return;
92
+ }
93
+ console.log(`\n${memories.length} memories:\n`);
94
+ for (const m of memories) {
95
+ const priority = m.priority !== undefined ? ` [p=${m.priority}]` : "";
96
+ console.log(` ${m._id} ${m.memoryType.padEnd(12)} ${m.title}${priority}`);
97
+ }
98
+ });
99
+ // ── search ──────────────────────────────────────────────────────────
100
+ program
101
+ .command("search <query>")
102
+ .description("Search memories")
103
+ .option("--project <id>", "Project ID", "default")
104
+ .option("--limit <n>", "Max results", "10")
105
+ .action(async (query, opts) => {
106
+ const convexUrl = requireConvexUrl();
107
+ const client = new ConvexHttpClient(convexUrl);
108
+ const results = await client.query("agentMemory/queries:search", {
109
+ projectId: opts.project,
110
+ query,
111
+ limit: parseInt(opts.limit),
112
+ });
113
+ if (results.length === 0) {
114
+ console.log("No results found.");
115
+ return;
116
+ }
117
+ console.log(`\n${results.length} results:\n`);
118
+ for (const m of results) {
119
+ console.log(` ${m._id} ${m.title}`);
120
+ // Show first 100 chars of content
121
+ const preview = m.content.slice(0, 100).replace(/\n/g, " ");
122
+ console.log(` ${preview}${m.content.length > 100 ? "..." : ""}`);
123
+ console.log();
124
+ }
125
+ });
126
+ // ── ingest-types ────────────────────────────────────────────────────
127
+ program
128
+ .command("ingest-types <glob>")
129
+ .description("Generate type documentation from TypeScript files and store as reference memories")
130
+ .option("--project <id>", "Project ID", "default")
131
+ .option("--user <id>", "User ID for user-scoped memories")
132
+ .option("--tags <tags>", "Comma-separated additional tags")
133
+ .option("--priority <n>", "Priority (0-1)", "0.6")
134
+ .option("--exclude <patterns>", "Comma-separated glob patterns to exclude")
135
+ .action(async (glob, opts) => {
136
+ const convexUrl = requireConvexUrl();
137
+ console.log(`Extracting types from: ${glob}`);
138
+ const result = await extractTypeMemories({
139
+ globPattern: glob,
140
+ cwd: process.cwd(),
141
+ tags: opts.tags ? opts.tags.split(",") : [],
142
+ priority: parseFloat(opts.priority),
143
+ exclude: opts.exclude ? opts.exclude.split(",") : undefined,
144
+ });
145
+ if (result.memories.length === 0) {
146
+ console.log(`No exported types found in ${result.filesProcessed} files.`);
147
+ return;
148
+ }
149
+ console.log(`Found ${result.memories.length} type definitions across ${result.filesProcessed} files.`);
150
+ console.log("Pushing to Convex...");
151
+ const client = new ConvexHttpClient(convexUrl);
152
+ const importResult = await client.mutation("agentMemory/mutations:importFromLocal", {
153
+ projectId: opts.project,
154
+ userId: opts.user,
155
+ memories: result.memories,
156
+ });
157
+ console.log(`Done: ${importResult.created} created, ${importResult.updated} updated, ${importResult.unchanged} unchanged`);
158
+ });
159
+ // ── mcp ─────────────────────────────────────────────────────────────
160
+ program
161
+ .command("mcp")
162
+ .description("Start the MCP server")
163
+ .option("--project <id>", "Project ID", "default")
164
+ .option("--read-only", "Disable write operations")
165
+ .option("--disable-tools <tools>", "Comma-separated list of tools to disable")
166
+ .option("--embedding-api-key <key>", "API key for vector search")
167
+ .action(async (opts) => {
168
+ const convexUrl = requireConvexUrl();
169
+ // Dynamic import to avoid loading MCP deps when not needed
170
+ const { startMcpServer } = await import("../mcp/server.js");
171
+ await startMcpServer({
172
+ convexUrl,
173
+ projectId: opts.project,
174
+ readOnly: opts.readOnly ?? false,
175
+ disabledTools: opts.disableTools
176
+ ? opts.disableTools.split(",")
177
+ : [],
178
+ embeddingApiKey: opts.embeddingApiKey,
179
+ });
180
+ });
181
+ // ── Helpers ─────────────────────────────────────────────────────────
182
+ function requireConvexUrl() {
183
+ const url = process.env.CONVEX_URL;
184
+ if (!url) {
185
+ console.error("Error: CONVEX_URL environment variable is required.");
186
+ console.error("Set it to your Convex deployment URL.");
187
+ process.exit(1);
188
+ }
189
+ return url;
190
+ }
191
+ program.parse();
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from "./types.js";
2
+ export declare const claudeCodeParser: Parser;
3
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/claude-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,gBAAgB,EAAE,MAiE9B,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { readdir, readFile, access } from "node:fs/promises";
2
+ import { join, basename } from "node:path";
3
+ import matter from "gray-matter";
4
+ import { computeChecksum } from "../../component/checksum.js";
5
+ export const claudeCodeParser = {
6
+ name: "Claude Code",
7
+ async detect(dir) {
8
+ try {
9
+ await access(join(dir, ".claude"));
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ },
16
+ async parse(dir) {
17
+ const memories = [];
18
+ // Parse .claude/rules/*.md
19
+ const rulesDir = join(dir, ".claude", "rules");
20
+ const ruleFiles = await safeReaddir(rulesDir);
21
+ for (const file of ruleFiles) {
22
+ if (!file.endsWith(".md"))
23
+ continue;
24
+ const fullPath = join(rulesDir, file);
25
+ const raw = await readFile(fullPath, "utf-8");
26
+ const { data, content } = matter(raw);
27
+ memories.push({
28
+ title: basename(file, ".md"),
29
+ content: content.trim(),
30
+ memoryType: "instruction",
31
+ scope: "project",
32
+ tags: [],
33
+ paths: data.paths,
34
+ priority: 0.9, // rules are high priority
35
+ source: "claude-code",
36
+ checksum: computeChecksum(content.trim()),
37
+ });
38
+ }
39
+ // Parse memory files from ~/.claude/projects/*/memory/*.md
40
+ const homeDir = process.env.HOME ?? "";
41
+ const projectsDir = join(homeDir, ".claude", "projects");
42
+ const projectDirs = await safeReaddir(projectsDir);
43
+ for (const projDir of projectDirs) {
44
+ const memDir = join(projectsDir, projDir, "memory");
45
+ const memFiles = await safeReaddir(memDir);
46
+ for (const file of memFiles) {
47
+ if (!file.endsWith(".md"))
48
+ continue;
49
+ const fullPath = join(memDir, file);
50
+ const raw = await readFile(fullPath, "utf-8");
51
+ const { data, content } = matter(raw);
52
+ memories.push({
53
+ title: basename(file, ".md"),
54
+ content: content.trim(),
55
+ memoryType: data.type === "feedback" ? "feedback" : "learning",
56
+ scope: "user",
57
+ tags: [],
58
+ priority: 0.5,
59
+ source: "claude-code",
60
+ checksum: computeChecksum(content.trim()),
61
+ });
62
+ }
63
+ }
64
+ return memories;
65
+ },
66
+ };
67
+ async function safeReaddir(dir) {
68
+ try {
69
+ return await readdir(dir);
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli/parsers/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from "./types.js";
2
+ export declare const codexParser: Parser;
3
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,WAAW,EAAE,MAuCzB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { readFile, access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { computeChecksum } from "../../component/checksum.js";
4
+ export const codexParser = {
5
+ name: "Codex",
6
+ async detect(dir) {
7
+ try {
8
+ await access(join(dir, "AGENTS.md"));
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ },
15
+ async parse(dir) {
16
+ const memories = [];
17
+ // Check AGENTS.override.md first (takes priority)
18
+ for (const filename of ["AGENTS.override.md", "AGENTS.md"]) {
19
+ try {
20
+ const raw = await readFile(join(dir, filename), "utf-8");
21
+ const content = raw.trim();
22
+ if (content.length === 0)
23
+ continue;
24
+ memories.push({
25
+ title: filename.replace(".md", "").toLowerCase(),
26
+ content,
27
+ memoryType: "instruction",
28
+ scope: "project",
29
+ tags: [],
30
+ priority: filename.includes("override") ? 1.0 : 0.8,
31
+ source: "codex",
32
+ checksum: computeChecksum(content),
33
+ });
34
+ }
35
+ catch {
36
+ // File doesn't exist
37
+ }
38
+ }
39
+ return memories;
40
+ },
41
+ };
42
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/parsers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,IAAI,EAAE,OAAO;IAEb,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAmB,EAAE,CAAC;QAEpC,kDAAkD;QAClD,KAAK,MAAM,QAAQ,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAEnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;oBAChD,OAAO;oBACP,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBACnD,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from "./types.js";
2
+ export declare const conductorParser: Parser;
3
+ //# sourceMappingURL=conductor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conductor.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/conductor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,eAAe,EAAE,MAyC7B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { readdir, readFile, access } from "node:fs/promises";
2
+ import { join, basename } from "node:path";
3
+ import { computeChecksum } from "../../component/checksum.js";
4
+ export const conductorParser = {
5
+ name: "Conductor",
6
+ async detect(dir) {
7
+ try {
8
+ await access(join(dir, ".conductor"));
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ },
15
+ async parse(dir) {
16
+ const memories = [];
17
+ const rulesDir = join(dir, ".conductor", "rules");
18
+ let files = [];
19
+ try {
20
+ files = await readdir(rulesDir);
21
+ }
22
+ catch {
23
+ return memories;
24
+ }
25
+ for (const file of files) {
26
+ if (!file.endsWith(".md"))
27
+ continue;
28
+ const content = (await readFile(join(rulesDir, file), "utf-8")).trim();
29
+ memories.push({
30
+ title: basename(file, ".md"),
31
+ content,
32
+ memoryType: "instruction",
33
+ scope: "project",
34
+ tags: [],
35
+ priority: 0.8,
36
+ source: "conductor",
37
+ checksum: computeChecksum(content),
38
+ });
39
+ }
40
+ return memories;
41
+ },
42
+ };
43
+ //# sourceMappingURL=conductor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conductor.js","sourceRoot":"","sources":["../../../src/cli/parsers/conductor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,IAAI,EAAE,WAAW;IAEjB,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAElD,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEvE,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;gBAC5B,OAAO;gBACP,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,GAAG;gBACb,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Parser } from "./types.js";
2
+ export declare const cursorParser: Parser;
3
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/cursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,YAAY,EAAE,MAwC1B,CAAC"}