watashi-db 0.0.13 → 0.0.15

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 (92) hide show
  1. package/CLAUDE.md +36 -0
  2. package/LICENSE +1 -1
  3. package/README.md +64 -2
  4. package/cowork-plugin/skills/groom/SKILL.md +51 -15
  5. package/cowork-plugin/skills/recall/SKILL.md +5 -6
  6. package/cowork-plugin/skills/reflect/SKILL.md +4 -4
  7. package/cowork-plugin/skills/remember/SKILL.md +3 -3
  8. package/cowork-plugin/skills/session-start/SKILL.md +3 -3
  9. package/dist/auth/token.d.ts +7 -0
  10. package/dist/auth/token.js +14 -0
  11. package/dist/auth/token.js.map +1 -0
  12. package/dist/config/schema.js +1 -1
  13. package/dist/constants.d.ts +9 -9
  14. package/dist/constants.js +29 -43
  15. package/dist/constants.js.map +1 -1
  16. package/dist/database/archive.js +6 -6
  17. package/dist/database/groom.js +5 -5
  18. package/dist/database/groom.js.map +1 -1
  19. package/dist/database/queries-core.d.ts +109 -5
  20. package/dist/database/queries-core.js +546 -186
  21. package/dist/database/queries-core.js.map +1 -1
  22. package/dist/database/queries.d.ts +85 -5
  23. package/dist/database/queries.js +33 -0
  24. package/dist/database/queries.js.map +1 -1
  25. package/dist/database/schema.d.ts +1 -0
  26. package/dist/database/schema.js +2299 -406
  27. package/dist/database/schema.js.map +1 -1
  28. package/dist/embedding/embed-on-write.d.ts +7 -1
  29. package/dist/embedding/embed-on-write.js +8 -3
  30. package/dist/embedding/embed-on-write.js.map +1 -1
  31. package/dist/hook.js +17 -9
  32. package/dist/hook.js.map +1 -1
  33. package/dist/http-server.d.ts +6 -0
  34. package/dist/http-server.js +235 -0
  35. package/dist/http-server.js.map +1 -0
  36. package/dist/index.js +14 -3
  37. package/dist/index.js.map +1 -1
  38. package/dist/resources/config-guide-content.d.ts +1 -1
  39. package/dist/resources/config-guide-content.js +2 -2
  40. package/dist/server-core.d.ts +15 -0
  41. package/dist/server-core.js +113 -0
  42. package/dist/server-core.js.map +1 -0
  43. package/dist/server-instructions.js +27 -24
  44. package/dist/server-instructions.js.map +1 -1
  45. package/dist/server.d.ts +4 -1
  46. package/dist/server.js +9 -103
  47. package/dist/server.js.map +1 -1
  48. package/dist/setup.js +5 -6
  49. package/dist/setup.js.map +1 -1
  50. package/dist/store/federation.d.ts +12 -1
  51. package/dist/store/federation.js +38 -0
  52. package/dist/store/federation.js.map +1 -1
  53. package/dist/store/sync-manager.d.ts +1 -1
  54. package/dist/store/sync-manager.js +9 -9
  55. package/dist/tools/claim-tools.d.ts +1 -1
  56. package/dist/tools/claim-tools.js +30 -17
  57. package/dist/tools/claim-tools.js.map +1 -1
  58. package/dist/tools/decision-tools.d.ts +1 -1
  59. package/dist/tools/decision-tools.js +23 -7
  60. package/dist/tools/decision-tools.js.map +1 -1
  61. package/dist/tools/episode-tools.d.ts +1 -1
  62. package/dist/tools/episode-tools.js +28 -7
  63. package/dist/tools/episode-tools.js.map +1 -1
  64. package/dist/tools/file-tools.d.ts +3 -0
  65. package/dist/tools/file-tools.js +350 -0
  66. package/dist/tools/file-tools.js.map +1 -0
  67. package/dist/tools/get-tools.d.ts +1 -1
  68. package/dist/tools/get-tools.js +39 -5
  69. package/dist/tools/get-tools.js.map +1 -1
  70. package/dist/tools/helpers.d.ts +40 -0
  71. package/dist/tools/helpers.js +69 -0
  72. package/dist/tools/helpers.js.map +1 -1
  73. package/dist/tools/knowledge-tools.d.ts +1 -1
  74. package/dist/tools/knowledge-tools.js +38 -6
  75. package/dist/tools/knowledge-tools.js.map +1 -1
  76. package/dist/tools/maintenance-tools.d.ts +1 -1
  77. package/dist/tools/maintenance-tools.js +95 -52
  78. package/dist/tools/maintenance-tools.js.map +1 -1
  79. package/dist/tools/memo-tools.d.ts +7 -11
  80. package/dist/tools/memo-tools.js +509 -309
  81. package/dist/tools/memo-tools.js.map +1 -1
  82. package/dist/tools/query-tools.d.ts +1 -1
  83. package/dist/tools/query-tools.js +266 -242
  84. package/dist/tools/query-tools.js.map +1 -1
  85. package/dist/types.d.ts +513 -76
  86. package/dist/types.js +185 -33
  87. package/dist/types.js.map +1 -1
  88. package/misc/20260316_110841_groom-recipe.md +483 -0
  89. package/misc/20260316_xaml-testing-library-recipe.md +817 -0
  90. package/misc/20260331_remote-transport-recipe.md +316 -0
  91. package/package.json +4 -2
  92. package/scripts/update-license-version.sh +7 -0
@@ -0,0 +1,316 @@
1
+ # Streamable HTTP トランスポート追加 — claude.ai / リモートクライアント対応
2
+
3
+ ## Context
4
+
5
+ watashi-db は現在 stdio トランスポートのみ対応(ローカル CLI 専用)。
6
+ claude.ai やモバイルアプリからの接続には Streamable HTTP トランスポートが必要。
7
+
8
+ MCP SDK `^1.12.1` を使用中。Streamable HTTP は MCP 仕様 2025-03-26 で標準化済み。
9
+ SDK の `StreamableHTTPServerTransport` は v2 系で提供予定だが、
10
+ 仕様準拠の HTTP エンドポイントを自前実装することも可能。
11
+
12
+ **ゴール**: 同一のツールロジックを stdio(ローカル)と HTTP(リモート)の両方で提供する。
13
+
14
+ **前提**:
15
+ - 既存の stdio モードはそのまま維持(破壊的変更なし)
16
+ - サーバー起動時のフラグ(`--http`)でモード選択
17
+ - OAuth 認証は後続ステップで追加(まず動くHTTPサーバーを作る)
18
+
19
+ ---
20
+
21
+ ## Step 1: HTTP サーバーエントリポイントの追加
22
+
23
+ 新ファイル `src/http-server.ts` を作成。Express で MCP プロトコルの HTTP エンドポイントを提供する。
24
+
25
+ ### `package.json`
26
+
27
+ 依存追加:
28
+ ```json
29
+ {
30
+ "dependencies": {
31
+ "express": "^5.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/express": "^5.0.0"
35
+ }
36
+ }
37
+ ```
38
+
39
+ ### `src/http-server.ts`
40
+
41
+ ```typescript
42
+ /**
43
+ * Streamable HTTP トランスポート — MCP over HTTP
44
+ * MCP 仕様 2025-03-26 準拠の Streamable HTTP エンドポイント
45
+ */
46
+ import express from "express";
47
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
48
+ import { createMcpServer } from "./server-core.js";
49
+
50
+ const PORT = parseInt(process.env.WATASHI_HTTP_PORT ?? "3100", 10);
51
+
52
+ export async function startHttpServer(): Promise<void> {
53
+ const app = express();
54
+ app.use(express.json());
55
+
56
+ // MCP サーバーインスタンス(ツール登録済み)
57
+ const { server, cleanup } = await createMcpServer();
58
+
59
+ // セッション管理: Mcp-Session-Id ヘッダでセッションを識別
60
+ const sessions = new Map<string, McpServer>();
61
+
62
+ // POST /mcp — MCP リクエスト受信
63
+ app.post("/mcp", async (req, res) => {
64
+ // TODO: OAuth 認証チェック (Step 4)
65
+ // TODO: セッション管理
66
+ // TODO: MCP JSON-RPC リクエストをサーバーに渡して応答を返す
67
+ });
68
+
69
+ // GET /mcp — SSE ストリーム(サーバー→クライアント通知用)
70
+ app.get("/mcp", (req, res) => {
71
+ // TODO: Server-Sent Events ストリーム
72
+ });
73
+
74
+ // DELETE /mcp — セッション終了
75
+ app.delete("/mcp", (req, res) => {
76
+ // TODO: セッションクリーンアップ
77
+ });
78
+
79
+ app.listen(PORT, () => {
80
+ console.error(`[watashi-db] HTTP server listening on port ${PORT}`);
81
+ });
82
+
83
+ process.on("SIGINT", async () => {
84
+ await cleanup();
85
+ process.exit(0);
86
+ });
87
+ }
88
+ ```
89
+
90
+ **注意**: Step 1 では HTTP エンドポイントの骨格のみ。MCP プロトコルの JSON-RPC 処理は Step 2 で実装。
91
+
92
+ ---
93
+
94
+ ## Step 2: server.ts からツール登録ロジックを分離
95
+
96
+ 現在 `server.ts` は McpServer の作成・ツール登録・トランスポート接続・初期化を全て行っている。
97
+ ツール登録と初期化ロジックを `server-core.ts` に抽出し、stdio / HTTP 両方から呼べるようにする。
98
+
99
+ ### `src/server-core.ts`(新規)
100
+
101
+ ```typescript
102
+ /**
103
+ * MCP サーバーのコア — ツール登録・初期化
104
+ * トランスポートに依存しない。stdio / HTTP 両方から利用される。
105
+ */
106
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
107
+ import { SERVER_INSTRUCTIONS } from "./server-instructions.js";
108
+ // ... 既存の import を server.ts から移動
109
+
110
+ export interface McpServerInstance {
111
+ server: McpServer;
112
+ cleanup: () => Promise<void>;
113
+ }
114
+
115
+ export async function createMcpServer(options?: {
116
+ devMode?: boolean;
117
+ }): Promise<McpServerInstance> {
118
+ // server.ts L37-136 のロジックを移動:
119
+ // 1. config.json 読み込み
120
+ // 2. StoreManager 初期化
121
+ // 3. SyncManager 初期化
122
+ // 4. セッション状態初期化
123
+ // 5. Embedding Provider 初期化
124
+ // 6. 起動時同期実行
125
+ // 7. McpServer 作成 + ツール登録
126
+
127
+ const server = new McpServer({ name: "watashi-db", version }, {
128
+ instructions: SERVER_INSTRUCTIONS,
129
+ });
130
+
131
+ // ツール登録(既存コードをそのまま移動)
132
+ registerClaimTools(server, toolPrefix);
133
+ registerDecisionTools(server, toolPrefix);
134
+ registerEpisodeTools(server, toolPrefix);
135
+ registerKnowledgeTools(server, toolPrefix);
136
+ registerUserMemoTools(server, toolPrefix);
137
+ registerMaintenanceTools(server, toolPrefix);
138
+
139
+ const cleanup = async () => {
140
+ storeManager.closeAll();
141
+ };
142
+
143
+ return { server, cleanup };
144
+ }
145
+ ```
146
+
147
+ ### `src/server.ts`(変更)
148
+
149
+ server-core.ts を使うように簡素化:
150
+
151
+ ```typescript
152
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
153
+ import { createMcpServer } from "./server-core.js";
154
+
155
+ export async function startServer(): Promise<void> {
156
+ const { server, cleanup } = await createMcpServer();
157
+ const transport = new StdioServerTransport();
158
+ await server.connect(transport);
159
+
160
+ process.on("SIGINT", async () => {
161
+ await cleanup();
162
+ process.exit(0);
163
+ });
164
+ }
165
+ ```
166
+
167
+ ### `src/index.ts`(変更)
168
+
169
+ `--http` フラグでモード選択:
170
+
171
+ ```typescript
172
+ const subcommand = process.argv[2];
173
+
174
+ if (subcommand === "http") {
175
+ const { startHttpServer } = await import("./http-server.js");
176
+ await startHttpServer();
177
+ } else if (subcommand === "hook") {
178
+ // ... 既存
179
+ } else {
180
+ // デフォルト: stdio モード(後方互換)
181
+ const { startServer } = await import("./server.js");
182
+ await startServer();
183
+ }
184
+ ```
185
+
186
+ ---
187
+
188
+ ## Step 3: MCP JSON-RPC over HTTP の実装
189
+
190
+ Streamable HTTP トランスポートの仕様に従い、JSON-RPC メッセージのルーティングを実装する。
191
+
192
+ ### MCP Streamable HTTP 仕様のポイント
193
+
194
+ - `POST /mcp`: クライアント → サーバーの JSON-RPC リクエスト
195
+ - リクエストボディ: JSON-RPC メッセージ(単一 or バッチ)
196
+ - レスポンス: JSON-RPC レスポンス(Content-Type: application/json)
197
+ - またはSSEストリーム(Content-Type: text/event-stream)— 長時間処理の場合
198
+ - `GET /mcp`: サーバー → クライアントの SSE ストリーム(通知・進捗用)
199
+ - `DELETE /mcp`: セッション終了
200
+ - セッション識別: `Mcp-Session-Id` ヘッダ
201
+
202
+ ### 実装方針
203
+
204
+ MCP SDK の `Server` クラスは内部的にトランスポートの `onmessage` コールバックで JSON-RPC を受け取る。
205
+ HTTP の場合、リクエストボディをパースして `onmessage` に渡し、レスポンスを HTTP レスポンスとして返す。
206
+
207
+ SDK v2 の StreamableHTTPServerTransport がリリースされれば置き換え可能だが、
208
+ 当面は薄い自前アダプタで対応する:
209
+
210
+ ```typescript
211
+ // src/transport/streamable-http.ts(新規)
212
+
213
+ import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
214
+ import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
215
+
216
+ /**
217
+ * Express の req/res を MCP Transport として橋渡しする薄いアダプタ。
218
+ * SDK v2 の StreamableHTTPServerTransport がリリースされたら置き換える。
219
+ */
220
+ export class HttpTransportAdapter implements Transport {
221
+ // セッション単位で作成
222
+ // onmessage / onerror / onclose コールバック
223
+ // send(): JSON-RPC レスポンスをキューに入れる
224
+ // handleRequest(body): リクエストボディを onmessage に渡す
225
+ }
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Step 4: OAuth 認証の追加
231
+
232
+ claude.ai からの MCP 接続は OAuth 2.0 が必須。
233
+
234
+ ### 認証フロー
235
+
236
+ 1. クライアント(claude.ai)が Authorization Code Flow でトークン取得
237
+ 2. リクエストに `Authorization: Bearer <token>` を付与
238
+ 3. watashi-db サーバーがトークンを検証
239
+
240
+ ### 実装方針
241
+
242
+ 初期実装はシンプルな Bearer Token 検証(共有シークレット方式):
243
+
244
+ ```typescript
245
+ // src/auth/token.ts(新規)
246
+
247
+ /**
248
+ * 環境変数 WATASHI_AUTH_TOKEN との照合。
249
+ * 将来的に OAuth 2.0 Resource Server(JWT 検証)に拡張。
250
+ */
251
+ export function validateRequest(authHeader: string | undefined): boolean {
252
+ const expected = process.env.WATASHI_AUTH_TOKEN;
253
+ if (!expected) return true; // トークン未設定 = 認証なし(ローカル開発用)
254
+ if (!authHeader?.startsWith("Bearer ")) return false;
255
+ return authHeader.slice(7) === expected;
256
+ }
257
+ ```
258
+
259
+ 将来の拡張(claude.ai 本格対応時):
260
+ - OAuth 2.0 Authorization Server の実装(または外部 IdP 連携)
261
+ - JWT 検証
262
+ - スコープベースのアクセス制御
263
+
264
+ ---
265
+
266
+ ## Step 5: デプロイ構成
267
+
268
+ ### ローカル HTTP モード(同一マシン内の複数クライアント向け)
269
+
270
+ ```bash
271
+ npx watashi-db http
272
+ # → localhost:3100 で起動
273
+ # Claude Desktop の MCP 設定で http://localhost:3100/mcp を指定
274
+ ```
275
+
276
+ ### リモートモード(VPS / クラウドホスティング)
277
+
278
+ ```
279
+ [claude.ai / モバイル] --HTTPS--> [VPS: watashi-db http] --> [SQLite on disk]
280
+ ```
281
+
282
+ - Caddy / nginx で TLS 終端
283
+ - systemd で watashi-db http をデーモン化
284
+ - SQLite ファイルは VPS 上のディスクに配置
285
+ - 既存の Sync 機能で VPS ↔ ローカル PC 間のデータ同期も可能
286
+
287
+ ### Cloudflare Workers + D1 案(将来)
288
+
289
+ SQLite 互換の D1 を使えば、サーバーレスでの運用も視野に入る。
290
+ ただし better-sqlite3 → D1 API への移行が必要で大きな変更になるため、
291
+ まずは VPS + SQLite で動かし、需要に応じて検討。
292
+
293
+ ---
294
+
295
+ ## 実装順序と見積もり
296
+
297
+ | Step | 内容 | 依存 |
298
+ |------|------|------|
299
+ | **Step 2** | server-core.ts 分離 | なし(**最初にやる**) |
300
+ | **Step 1** | HTTP サーバー骨格 | Step 2 |
301
+ | **Step 3** | JSON-RPC over HTTP 実装 | Step 1 |
302
+ | **Step 4** | OAuth 認証 | Step 3 |
303
+ | **Step 5** | デプロイ構成 | Step 3 |
304
+
305
+ Step 2 → 1 → 3 で最小限の HTTP サーバーが動く。
306
+ Step 4 は claude.ai 接続時に必須。Step 5 はインフラ側の作業。
307
+
308
+ ---
309
+
310
+ ## テスト方針
311
+
312
+ - Step 2: 既存テスト全通過(リファクタリングのみ)
313
+ - Step 1-3: integration.test.ts に HTTP クライアントテストを追加
314
+ - `fetch("http://localhost:3100/mcp", { method: "POST", body: JSON-RPC })` で MCP ツール呼び出し
315
+ - Step 4: 認証あり/なしのテスト
316
+ - E2E: Claude Desktop から localhost:3100 に接続して watashi_get(profile) が返ることを手動確認
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "watashi-db",
3
- "version": "0.0.13",
3
+ "version": "0.0.15",
4
4
  "description": "わたしDB - User-owned personal context database as an MCP server for AI tools",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -25,7 +25,9 @@
25
25
  "pretest": "tsc",
26
26
  "test": "vitest run",
27
27
  "test:watch": "vitest",
28
- "prepublishOnly": "npm run build && npm test"
28
+ "prepublishOnly": "npm run build && npm test",
29
+ "preversion": "npm test",
30
+ "version": "bash scripts/update-license-version.sh"
29
31
  },
30
32
  "dependencies": {
31
33
  "@modelcontextprotocol/sdk": "^1.12.1",
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+ # Called by npm "version" script to update LICENSE with the new version.
3
+ # $npm_package_version is set by npm automatically.
4
+ set -euo pipefail
5
+
6
+ sed -i "s/Licensed Work: watashi-db .*/Licensed Work: watashi-db $npm_package_version/" LICENSE
7
+ git add LICENSE