cc-memory 2.0.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.
package/README.md ADDED
@@ -0,0 +1,369 @@
1
+ # cc-memory
2
+
3
+ > マルチエージェント開発で、共有知識と専門知識を分離管理するメモリサーバー
4
+
5
+ [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18.0.0-green.svg)](https://nodejs.org/)
7
+ [![MCP](https://img.shields.io/badge/MCP-Compatible-purple.svg)](https://modelcontextprotocol.io/)
8
+
9
+ ---
10
+
11
+ ## コンセプト
12
+
13
+ ```
14
+ Shared Scope(共有層)← 全エージェント読める、manager のみ書ける
15
+ ├── プロジェクト要件
16
+ ├── コーディング規約
17
+ └── 運用ルール
18
+
19
+ Personal Scope(個人層)← 本人のみ読み書き
20
+ ├── Web AG: Nginx経験、フロント知識
21
+ ├── DB AG: MySQL経験、クエリ最適化
22
+ └── Infra AG: k8s経験、監視設定
23
+ ```
24
+
25
+ マネージャーがチーム全体の知識を **Shared Scope** に集約し、各ワーカーは自分だけの経験を **Personal Scope** に蓄積。これにより、知識の一貫性と専門性を両立します。
26
+
27
+ ---
28
+
29
+ ## 特徴
30
+
31
+ - **スコープモデル** — `shared`(共有)と `personal`(個人)の 2 層でメモリを管理
32
+ - **Role-based Access Control** — `manager` は全スコープ読み書き可、`worker` は shared 読み取り+自分の personal のみ
33
+ - **MCP 対応** — Claude Code やその他 MCP クライアントからそのまま使える
34
+ - **SQLite** — ローカル保存、クラウド不要、プライバシー重視
35
+ - **8 API endpoints** — シンプルで必要十分な API セット
36
+
37
+ ---
38
+
39
+ ## インストール & セットアップ
40
+
41
+ ```bash
42
+ # グローバルインストール
43
+ npm install -g cc-memory
44
+
45
+ # データベース初期化
46
+ cc-memory setup
47
+ ```
48
+
49
+ ### Claude Code で使う
50
+
51
+ `~/.claude/settings.json` に以下を追加:
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "cc-memory": {
57
+ "command": "cc-memory",
58
+ "args": ["serve"]
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ > `cc-memory setup` を実行すると DB ファイルが作成されます。デフォルトパスは `./cc-memory.db`(環境変数 `CC_MEMORY_DB` で変更可)。
65
+
66
+ ---
67
+
68
+ ## MCP API 一覧
69
+
70
+ ### メモリ操作(4 本)
71
+
72
+ | ツール | 説明 |
73
+ |--------|------|
74
+ | `memory_store` | メモリを保存。shared スコープは manager のみ書き込み可 |
75
+ | `memory_recall` | クエリでメモリを検索。関連度順にランキング |
76
+ | `memory_list` | スコープ内の全メモリを一覧 |
77
+ | `memory_delete` | メモリを削除。オーナーまたは manager のみ |
78
+
79
+ ### プロジェクト管理(2 本)
80
+
81
+ | ツール | 説明 |
82
+ |--------|------|
83
+ | `project_create` | 新しいプロジェクトを作成 |
84
+ | `project_list` | 全プロジェクトを一覧 |
85
+
86
+ ### エージェント管理(2 本)
87
+
88
+ | ツール | 説明 |
89
+ |--------|------|
90
+ | `agent_register` | エージェントをプロジェクトに登録(role: manager / worker) |
91
+ | `agent_list` | プロジェクト内の全エージェントを一覧 |
92
+
93
+ ### パラメータ詳細
94
+
95
+ <details>
96
+ <summary><code>memory_store</code></summary>
97
+
98
+ | パラメータ | 型 | 必須 | 説明 |
99
+ |-----------|------|------|------|
100
+ | `scope` | `"shared" \| "personal"` | ✅ | メモリスコープ |
101
+ | `agent_id` | `string` | ✅ | 呼び出し元エージェント ID |
102
+ | `content` | `string` | ✅ | メモリ内容 |
103
+ | `tags` | `string[]` | - | タグ(検索用) |
104
+ | `project_id` | `string` | - | プロジェクト ID(デフォルト: `"default"`) |
105
+
106
+ </details>
107
+
108
+ <details>
109
+ <summary><code>memory_recall</code></summary>
110
+
111
+ | パラメータ | 型 | 必須 | 説明 |
112
+ |-----------|------|------|------|
113
+ | `scope` | `"shared" \| "personal" \| "all"` | ✅ | 検索スコープ |
114
+ | `query` | `string` | ✅ | 検索クエリ |
115
+ | `caller_id` | `string` | ✅* | 呼び出し元エージェント ID(権限チェック用) |
116
+ | `agent_id` | `string` | - | エージェント ID フィルタ |
117
+ | `project_id` | `string` | - | プロジェクト ID |
118
+ | `limit` | `number` | - | 最大件数(1-100、デフォルト: 10) |
119
+
120
+ > *`caller_id` は権限チェックのため実質必須です。
121
+
122
+ </details>
123
+
124
+ <details>
125
+ <summary><code>memory_list</code></summary>
126
+
127
+ | パラメータ | 型 | 必須 | 説明 |
128
+ |-----------|------|------|------|
129
+ | `scope` | `"shared" \| "personal"` | ✅ | メモリスコープ |
130
+ | `agent_id` | `string` | - | エージェント ID フィルタ |
131
+ | `project_id` | `string` | - | プロジェクト ID |
132
+
133
+ </details>
134
+
135
+ <details>
136
+ <summary><code>memory_delete</code></summary>
137
+
138
+ | パラメータ | 型 | 必須 | 説明 |
139
+ |-----------|------|------|------|
140
+ | `memory_id` | `string` | ✅ | 削除するメモリの ID |
141
+ | `caller_id` | `string` | ✅* | 呼び出し元エージェント ID |
142
+ | `project_id` | `string` | - | プロジェクト ID |
143
+
144
+ </details>
145
+
146
+ <details>
147
+ <summary><code>project_create</code></summary>
148
+
149
+ | パラメータ | 型 | 必須 | 説明 |
150
+ |-----------|------|------|------|
151
+ | `project_id` | `string` | ✅ | プロジェクト ID |
152
+ | `description` | `string` | ✅ | プロジェクトの説明 |
153
+
154
+ </details>
155
+
156
+ <details>
157
+ <summary><code>project_list</code></summary>
158
+
159
+ パラメータなし。
160
+
161
+ </details>
162
+
163
+ <details>
164
+ <summary><code>agent_register</code></summary>
165
+
166
+ | パラメータ | 型 | 必須 | 説明 |
167
+ |-----------|------|------|------|
168
+ | `project_id` | `string` | ✅ | プロジェクト ID |
169
+ | `agent_id` | `string` | ✅ | エージェント ID |
170
+ | `role` | `"manager" \| "worker"` | ✅ | 役割 |
171
+
172
+ </details>
173
+
174
+ <details>
175
+ <summary><code>agent_list</code></summary>
176
+
177
+ | パラメータ | 型 | 必須 | 説明 |
178
+ |-----------|------|------|------|
179
+ | `project_id` | `string` | ✅ | プロジェクト ID |
180
+
181
+ </details>
182
+
183
+ ---
184
+
185
+ ## 使い方(マルチエージェントシナリオ)
186
+
187
+ ### 1. プロジェクト作成
188
+
189
+ ```json
190
+ { "tool": "project_create", "project_id": "my-app", "description": "ECサイト開発" }
191
+ ```
192
+
193
+ ### 2. エージェント登録
194
+
195
+ ```json
196
+ { "tool": "agent_register", "project_id": "my-app", "agent_id": "lead", "role": "manager" }
197
+ { "tool": "agent_register", "project_id": "my-app", "agent_id": "web-worker", "role": "worker" }
198
+ { "tool": "agent_register", "project_id": "my-app", "agent_id": "db-worker", "role": "worker" }
199
+ ```
200
+
201
+ ### 3. マネージャーが共有知識を保存
202
+
203
+ ```json
204
+ {
205
+ "tool": "memory_store",
206
+ "scope": "shared",
207
+ "agent_id": "lead",
208
+ "content": "TypeScript + Next.js で開発。ESLint strict モード必須。",
209
+ "tags": ["規約", "tech-stack"],
210
+ "project_id": "my-app"
211
+ }
212
+ ```
213
+
214
+ ### 4. ワーカーが共有知識を参照 & 個人メモリに記録
215
+
216
+ ```json
217
+ // 共有知識を検索
218
+ { "tool": "memory_recall", "scope": "shared", "query": "tech-stack", "caller_id": "web-worker", "project_id": "my-app" }
219
+
220
+ // 個人メモリに作業記録を保存
221
+ {
222
+ "tool": "memory_store",
223
+ "scope": "personal",
224
+ "agent_id": "web-worker",
225
+ "content": "Nginx リバースプロキシ設定完了。ポート 3000 → 80 に転送。",
226
+ "tags": ["nginx", "infra"],
227
+ "project_id": "my-app"
228
+ }
229
+ ```
230
+
231
+ ---
232
+
233
+ ## スコープと権限
234
+
235
+ | 操作 | Shared Scope | Personal Scope(自分) | Personal Scope(他人) |
236
+ |------|:---:|:---:|:---:|
237
+ | **Manager 読み取り** | ✅ | ✅ | ✅ |
238
+ | **Manager 書き込み** | ✅ | ✅ | ❌ |
239
+ | **Worker 読み取り** | ✅ | ✅ | ❌ |
240
+ | **Worker 書き込み** | ❌ | ✅ | ❌ |
241
+ | **削除** | Manager のみ | オーナー or Manager | Manager のみ |
242
+
243
+ ---
244
+
245
+ ## CLI コマンド
246
+
247
+ ```bash
248
+ cc-memory setup # DB 初期化
249
+ cc-memory doctor # 環境チェック
250
+ cc-memory status # プロジェクト・メモリの統計表示
251
+ ```
252
+
253
+ ---
254
+
255
+ ## 設定
256
+
257
+ ### 環境変数
258
+
259
+ | 変数 | デフォルト | 説明 |
260
+ |------|-----------|------|
261
+ | `CC_MEMORY_DB` | `cc-memory.db` | SQLite データベースのパス |
262
+
263
+ ### Claude Code 設定
264
+
265
+ ```json
266
+ {
267
+ "mcpServers": {
268
+ "cc-memory": {
269
+ "command": "cc-memory",
270
+ "args": ["serve"]
271
+ }
272
+ }
273
+ }
274
+ ```
275
+
276
+ ---
277
+
278
+ ## FAQ
279
+
280
+ **Q: データはどこに保存されますか?**
281
+ A: ローカルの SQLite ファイル(デフォルト: `./cc-memory.db`)。クラウドには送信されません。
282
+
283
+ **Q: メモリを全削除するには?**
284
+ A: DB ファイルを削除して `cc-memory setup` を再実行してください。
285
+
286
+ **Q: Claude Code 以外でも使えますか?**
287
+ A: はい。MCP プロトコルに対応した任意のクライアントから利用できます。
288
+
289
+ **Q: プロジェクトを指定しないとどうなりますか?**
290
+ A: `"default"` プロジェクトが自動的に使用されます(初回起動時に作成済み)。
291
+
292
+ ---
293
+
294
+ ## v1 からの移行
295
+
296
+ v1 のコードは [`v1` ブランチ](https://github.com/0xchoux1/cc-memory/tree/v1)で保全されています。
297
+
298
+ ### 主な変更点
299
+
300
+ | | v1 | v2 |
301
+ |---|---|---|
302
+ | **メモリモデル** | 3 層(Working / Episodic / Semantic) | 2 スコープ(Shared / Personal) |
303
+ | **アクセス制御** | チーム・API キーベース | Role-based(manager / worker) |
304
+ | **API 数** | 20+ ツール | 8 ツール |
305
+ | **同期** | Tachikoma / Git / Cloud | なし(ローカル完結) |
306
+ | **設計思想** | 機能豊富 | シンプル・必要十分 |
307
+
308
+ > ⚠️ v1 と v2 のデータベースには互換性がありません。v2 は新しい DB で始めてください。
309
+
310
+ ---
311
+
312
+ ## English
313
+
314
+ ### What is cc-memory?
315
+
316
+ A memory server for multi-agent development that separates **shared knowledge** from **personal expertise** using scope-based access control.
317
+
318
+ ### Key Features
319
+
320
+ - **Scope model** — `shared` (team-wide, manager-writable) and `personal` (agent-private)
321
+ - **Role-based access** — `manager` reads/writes all; `worker` reads shared + own personal only
322
+ - **MCP compatible** — works with Claude Code and any MCP client
323
+ - **SQLite** — local storage, no cloud, privacy-first
324
+ - **8 API endpoints** — simple and sufficient
325
+
326
+ ### Quick Start
327
+
328
+ ```bash
329
+ npm install -g cc-memory
330
+ cc-memory setup
331
+ ```
332
+
333
+ Add to `~/.claude/settings.json`:
334
+
335
+ ```json
336
+ {
337
+ "mcpServers": {
338
+ "cc-memory": {
339
+ "command": "cc-memory",
340
+ "args": ["serve"]
341
+ }
342
+ }
343
+ }
344
+ ```
345
+
346
+ ### API
347
+
348
+ **Memory:** `memory_store`, `memory_recall`, `memory_list`, `memory_delete`
349
+ **Projects:** `project_create`, `project_list`
350
+ **Agents:** `agent_register`, `agent_list`
351
+
352
+ ### Scope & Permissions
353
+
354
+ | Action | Shared | Own Personal | Other's Personal |
355
+ |--------|:---:|:---:|:---:|
356
+ | Manager read | ✅ | ✅ | ✅ |
357
+ | Manager write | ✅ | ✅ | ❌ |
358
+ | Worker read | ✅ | ✅ | ❌ |
359
+ | Worker write | ❌ | ✅ | ❌ |
360
+
361
+ ### Migration from v1
362
+
363
+ v1 is preserved on the [`v1` branch](https://github.com/0xchoux1/cc-memory/tree/v1). v2 databases are not compatible with v1 — start fresh.
364
+
365
+ ---
366
+
367
+ ## License
368
+
369
+ MIT
package/dist/auth.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { Storage } from "./storage.js";
2
+ import type { Scope, Role } from "./types.js";
3
+ export declare class AuthError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export declare function checkStorePermission(storage: Storage, projectId: string, agentId: string, scope: Scope): void;
7
+ export declare function checkReadPermission(storage: Storage, projectId: string, requestingAgentId: string, scope: Scope, targetAgentId?: string): void;
8
+ export declare function getAgentRole(storage: Storage, projectId: string, agentId: string): Role | null;
9
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GACX,IAAI,CASN;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,KAAK,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAeN;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,IAAI,GAAG,IAAI,CAGb"}
package/dist/auth.js ADDED
@@ -0,0 +1,35 @@
1
+ export class AuthError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "AuthError";
5
+ }
6
+ }
7
+ export function checkStorePermission(storage, projectId, agentId, scope) {
8
+ const agent = storage.getAgent(projectId, agentId);
9
+ if (!agent) {
10
+ throw new AuthError(`Agent "${agentId}" is not registered in project "${projectId}"`);
11
+ }
12
+ if (scope === "shared" && agent.role !== "manager") {
13
+ throw new AuthError("Only managers can write to shared scope");
14
+ }
15
+ }
16
+ export function checkReadPermission(storage, projectId, requestingAgentId, scope, targetAgentId) {
17
+ const agent = storage.getAgent(projectId, requestingAgentId);
18
+ if (!agent) {
19
+ throw new AuthError(`Agent "${requestingAgentId}" is not registered in project "${projectId}"`);
20
+ }
21
+ // shared: everyone can read
22
+ if (scope === "shared")
23
+ return;
24
+ // personal: own data or manager
25
+ if (scope === "personal") {
26
+ if (targetAgentId && targetAgentId !== requestingAgentId && agent.role !== "manager") {
27
+ throw new AuthError("Workers can only read their own personal memories");
28
+ }
29
+ }
30
+ }
31
+ export function getAgentRole(storage, projectId, agentId) {
32
+ const agent = storage.getAgent(projectId, agentId);
33
+ return agent?.role ?? null;
34
+ }
35
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAAiB,EACjB,OAAe,EACf,KAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,UAAU,OAAO,mCAAmC,SAAS,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,SAAiB,EACjB,iBAAyB,EACzB,KAAY,EACZ,aAAsB;IAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,UAAU,iBAAiB,mCAAmC,SAAS,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,4BAA4B;IAC5B,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO;IAE/B,gCAAgC;IAChC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,IAAI,aAAa,IAAI,aAAa,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACrF,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,SAAiB,EACjB,OAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;AAC7B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ // cc-memory v2 CLI - setup, doctor, status
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { Storage } from "./storage.js";
6
+ const DB_PATH = process.env.CC_MEMORY_DB ?? "cc-memory.db";
7
+ function setup() {
8
+ console.log("Setting up cc-memory v2...");
9
+ const storage = new Storage(DB_PATH);
10
+ storage.close();
11
+ console.log(`Database created at: ${resolve(DB_PATH)}`);
12
+ console.log("Setup complete.");
13
+ }
14
+ function doctor() {
15
+ console.log("cc-memory v2 doctor\n");
16
+ // Check Node version
17
+ const nodeVersion = process.version;
18
+ console.log(`Node.js: ${nodeVersion} ✅`);
19
+ // Check better-sqlite3
20
+ try {
21
+ require("better-sqlite3");
22
+ console.log("better-sqlite3: installed ✅");
23
+ }
24
+ catch {
25
+ console.log("better-sqlite3: missing ❌");
26
+ }
27
+ // Check DB
28
+ if (existsSync(resolve(DB_PATH))) {
29
+ console.log(`Database: ${resolve(DB_PATH)} ✅`);
30
+ try {
31
+ const storage = new Storage(DB_PATH);
32
+ const projects = storage.listProjects();
33
+ console.log(` Projects: ${projects.length}`);
34
+ storage.close();
35
+ }
36
+ catch (err) {
37
+ console.log(` Error reading DB: ${err}`);
38
+ }
39
+ }
40
+ else {
41
+ console.log(`Database: not found (run 'cc-memory setup')`);
42
+ }
43
+ }
44
+ function status() {
45
+ if (!existsSync(resolve(DB_PATH))) {
46
+ console.log("No database found. Run 'cc-memory setup' first.");
47
+ return;
48
+ }
49
+ const storage = new Storage(DB_PATH);
50
+ const projects = storage.listProjects();
51
+ console.log("cc-memory v2 status\n");
52
+ console.log(`Database: ${resolve(DB_PATH)}`);
53
+ console.log(`Projects: ${projects.length}`);
54
+ for (const project of projects) {
55
+ const agents = storage.listAgents(project.id);
56
+ const shared = storage.listMemories("shared", project.id);
57
+ const personal = storage.listMemories("personal", project.id);
58
+ console.log(`\n [${project.id}] ${project.description ?? ""}`);
59
+ console.log(` Agents: ${agents.length}`);
60
+ console.log(` Shared memories: ${shared.length}`);
61
+ console.log(` Personal memories: ${personal.length}`);
62
+ }
63
+ storage.close();
64
+ }
65
+ // Main
66
+ const command = process.argv[2];
67
+ switch (command) {
68
+ case "setup":
69
+ setup();
70
+ break;
71
+ case "doctor":
72
+ doctor();
73
+ break;
74
+ case "status":
75
+ status();
76
+ break;
77
+ default:
78
+ console.log("cc-memory v2 CLI");
79
+ console.log("Usage: cc-memory <command>");
80
+ console.log("Commands: setup, doctor, status");
81
+ process.exit(command ? 1 : 0);
82
+ }
83
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Memory } from "./types.js";
2
+ /**
3
+ * Score a memory against a query string.
4
+ * Returns 0 if no match, higher = better match.
5
+ */
6
+ export declare function scoreMemory(memory: Memory, query: string): number;
7
+ /**
8
+ * Filter and rank memories by query relevance.
9
+ */
10
+ export declare function filterAndRank(memories: Memory[], query: string, limit: number): Memory[];
11
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBjE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOxF"}
package/dist/search.js ADDED
@@ -0,0 +1,40 @@
1
+ // cc-memory v2 search - text-based search utilities
2
+ // Currently delegates to Storage.searchMemories which does keyword matching.
3
+ // This module exists as the extension point for future semantic search.
4
+ /**
5
+ * Score a memory against a query string.
6
+ * Returns 0 if no match, higher = better match.
7
+ */
8
+ export function scoreMemory(memory, query) {
9
+ const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
10
+ if (terms.length === 0)
11
+ return 0;
12
+ const text = (memory.content + " " + (memory.tags?.join(" ") ?? "")).toLowerCase();
13
+ let score = 0;
14
+ for (const term of terms) {
15
+ // Exact word boundary match scores higher
16
+ const regex = new RegExp(`\\b${escapeRegex(term)}\\b`, "i");
17
+ if (regex.test(text)) {
18
+ score += 2;
19
+ }
20
+ else if (text.includes(term)) {
21
+ score += 1;
22
+ }
23
+ }
24
+ return score;
25
+ }
26
+ function escapeRegex(s) {
27
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
28
+ }
29
+ /**
30
+ * Filter and rank memories by query relevance.
31
+ */
32
+ export function filterAndRank(memories, query, limit) {
33
+ return memories
34
+ .map((m) => ({ memory: m, score: scoreMemory(m, query) }))
35
+ .filter((s) => s.score > 0)
36
+ .sort((a, b) => b.score - a.score)
37
+ .slice(0, limit)
38
+ .map((s) => s.memory);
39
+ }
40
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,6EAA6E;AAC7E,wEAAwE;AAIxE;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAa;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnF,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,0CAA0C;QAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,KAAa,EAAE,KAAa;IAC5E,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;SACzD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ // cc-memory v2 - MCP Server entry point
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
6
+ import { Storage } from "./storage.js";
7
+ import { toolDefinitions, createToolHandler } from "./tools.js";
8
+ const DB_PATH = process.env.CC_MEMORY_DB ?? "cc-memory.db";
9
+ const storage = new Storage(DB_PATH);
10
+ const handleTool = createToolHandler(storage);
11
+ const server = new Server({ name: "cc-memory", version: "2.0.0" }, { capabilities: { tools: {} } });
12
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
13
+ tools: toolDefinitions,
14
+ }));
15
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
16
+ const { name, arguments: args } = request.params;
17
+ const result = await handleTool(name, args ?? {});
18
+ return {
19
+ content: [{ type: "text", text: result }],
20
+ };
21
+ });
22
+ async function main() {
23
+ const transport = new StdioServerTransport();
24
+ await server.connect(transport);
25
+ console.error("cc-memory v2 MCP server started");
26
+ }
27
+ main().catch((err) => {
28
+ console.error("Fatal:", err);
29
+ process.exit(1);
30
+ });
31
+ // Cleanup on exit
32
+ process.on("SIGINT", () => {
33
+ storage.close();
34
+ process.exit(0);
35
+ });
36
+ process.on("SIGTERM", () => {
37
+ storage.close();
38
+ process.exit(0);
39
+ });
40
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,wCAAwC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;AACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,eAAe;CACvB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Memory, Project, Agent, Scope, Role } from "./types.js";
2
+ export declare class Storage {
3
+ private db;
4
+ constructor(dbPath?: string);
5
+ private migrateCreatedBy;
6
+ private ensureDefaultProject;
7
+ createProject(id: string, description: string): Project;
8
+ listProjects(): Project[];
9
+ getProject(id: string): Project | undefined;
10
+ registerAgent(projectId: string, agentId: string, role: Role): Agent;
11
+ listAgents(projectId: string): Agent[];
12
+ getAgent(projectId: string, agentId: string): Agent | undefined;
13
+ storeMemory(projectId: string, scope: Scope, agentId: string | null, content: string, tags: string[] | null, createdBy?: string | null): Memory;
14
+ listMemories(scope: Scope, projectId?: string, agentId?: string): Memory[];
15
+ searchMemories(query: string, scope: Scope | "all", projectId?: string, agentId?: string, limit?: number): Memory[];
16
+ getMemory(id: string): Memory | undefined;
17
+ deleteMemory(id: string): boolean;
18
+ close(): void;
19
+ }
20
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAkCtE,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,GAAE,MAAuB;IAW3C,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,oBAAoB;IAS5B,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAQvD,YAAY,IAAI,OAAO,EAAE;IAIzB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAK3C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK;IAUpE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAMtC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAO/D,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EACrB,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,MAAM;IAYT,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAiB1E,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,GAAG,KAAK,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,GAAE,MAAW,GACjB,MAAM,EAAE;IAoCX,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKjC,KAAK,IAAI,IAAI;CAGd"}