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
package/CLAUDE.md ADDED
@@ -0,0 +1,36 @@
1
+ # リリース手順
2
+
3
+ **重要: 順番を厳守すること。push 前にタグを remote に送らない。**
4
+
5
+ 1. `npm version patch` — package.json 更新 + コミット + **ローカルタグ自動作成**
6
+ 2. `git push origin main` — コミットを先に push(ここで失敗したらタグは送らない)
7
+ 3. `git push origin v<version>` — push 成功を確認してからタグを push
8
+ 4. GitHub Actions (publish.yml) が tag push → npm publish を自動実行
9
+
10
+ ### なぜこの順番か
11
+
12
+ - `npm version` はタグも自動作成するので `git tag` は不要
13
+ - コミットの push が失敗した場合、タグだけ remote にある不整合を防ぐため、push を2段階にする
14
+ - タグ番号は package.json の version と一致させる(真実の源泉は package.json)
15
+
16
+ ### タグの打ち直しが必要になった場合
17
+
18
+ ```bash
19
+ git tag -d v<version> # ローカルタグ削除
20
+ git push origin :refs/tags/v<version> # リモートタグ削除(push済みの場合のみ)
21
+ # 修正後、再度 npm version で打ち直す
22
+ ```
23
+
24
+ ### ライセンス
25
+
26
+ BSL 1.1。リリース時に LICENSE の `Licensed Work` バージョンも更新すること。
27
+
28
+ # バージョンアップ時の LICENSE 更新
29
+
30
+ LICENSE ファイルの `Licensed Work:` 行を新バージョンに合わせて更新する:
31
+
32
+ ```
33
+ Licensed Work: watashi-db <new-version>
34
+ ```
35
+
36
+ Change Date は各バージョンのリリース日から3年後に設定する。
package/LICENSE CHANGED
@@ -3,7 +3,7 @@ Business Source License 1.1
3
3
  Parameters
4
4
 
5
5
  Licensor: bareforge
6
- Licensed Work: watashi-db 0.0.12
6
+ Licensed Work: watashi-db 0.0.15
7
7
  The Licensed Work is (c) 2026 bareforge
8
8
  Additional Use Grant: You may make use of the Licensed Work, provided that
9
9
  you may not use the Licensed Work for a Commercial
package/README.md CHANGED
@@ -99,6 +99,31 @@ Claude Code を再起動すれば使えます。
99
99
  > watashi-db への記録・活用は server instructions 経由の LLM 任せとなります。
100
100
  > 背景: [#31](https://github.com/bareforge/watashi-db/issues/31), [#32](https://github.com/bareforge/watashi-db/issues/32)
101
101
 
102
+ ### ステップ 2': Codex CLI 向け推奨設定(オプション)
103
+
104
+ Codex CLI で使う場合、デフォルトは全許可(読み書き両方可能)で、そのまま使えます。
105
+ 書き込みを制限したい場合は、`~/.watashi-db/config.json` の `client_policies` で制御できます:
106
+
107
+ ```json
108
+ {
109
+ "client_policies": {
110
+ "codex": {
111
+ "read": {
112
+ "categories": ["skill", "workflow", "knowledge", "preference"],
113
+ "scopes": ["global", "project:*"]
114
+ },
115
+ "write": "none"
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ Embedding(意味検索)を使う場合は、MCP 登録時に環境変数を渡してください:
122
+
123
+ ```bash
124
+ codex mcp add watashi-db --env OPENAI_API_KEY=$OPENAI_API_KEY -- npx -y watashi-db@latest
125
+ ```
126
+
102
127
  ### Claude Code Cowork プラグイン
103
128
 
104
129
  リポジトリの `cowork-plugin/` ディレクトリに Cowork 用プラグインが含まれています。
@@ -128,6 +153,37 @@ MCP 設定で `watashi-db@latest` を指定していれば、Claude の再起動
128
153
  npm install -g watashi-db@latest
129
154
  ```
130
155
 
156
+ ### Embedding — 意味検索(オプション)
157
+
158
+ Embedding を設定すると、キーワード一致だけでなく意味の近さで検索できるようになります。
159
+ 未設定でも FTS5(全文検索)のみで動作します。
160
+
161
+ 開発時点(2026-03)では、以下の3つのプロバイダーが組み込まれています。
162
+ それぞれの環境と判断に基づいて使用するモデルを選択してください。
163
+
164
+ | プロバイダー | 費用 | 特徴 | 設定例 |
165
+ |-------------|------|------|--------|
166
+ | Transformers.js | 無料 | ローカル実行。初回に約 80MB のモデルダウンロードが発生し、常駐メモリが約 100〜150MB 増加する | `"provider": "transformers"`, `"model": "Xenova/all-MiniLM-L6-v2"`, `"dimensions": 384` |
167
+ | Ollama | 無料 | 別途 [Ollama](https://ollama.com) サーバーを起動する必要がある。より高精度なモデルも選択可能 | `"provider": "ollama"`, `"model": "nomic-embed-text"`, `"dimensions": 768`, `"base_url": "http://localhost:11434"` |
168
+ | OpenAI | 有料 | 高精度。環境変数 `OPENAI_API_KEY` が必要 | `"provider": "openai"`, `"model": "text-embedding-3-small"`, `"dimensions": 1536` |
169
+
170
+ `~/.watashi-db/config.json` に `embedding` セクションを追加してください:
171
+
172
+ ```json
173
+ // Transformers.js(無料・ローカル)
174
+ { "embedding": { "provider": "transformers", "model": "Xenova/all-MiniLM-L6-v2", "dimensions": 384 } }
175
+
176
+ // Ollama(無料・要サーバー)
177
+ { "embedding": { "provider": "ollama", "model": "nomic-embed-text", "dimensions": 768, "base_url": "http://localhost:11434" } }
178
+
179
+ // OpenAI(有料・高精度)
180
+ { "embedding": { "provider": "openai", "model": "text-embedding-3-small", "dimensions": 1536 } }
181
+ ```
182
+
183
+ > [!WARNING]
184
+ > プロバイダーやモデルを切り替えると、既存の全レコードのベクトル値を更新する必要があります。
185
+ > 更新は `watashi_maintain(action="backfill_embeddings")` で行えますが、有料モデルを選択した場合はこの作業でまとまった API 課金が発生します。
186
+
131
187
  ### バックアップ・同期・マルチStore(オプション)
132
188
 
133
189
  `~/.watashi-db/config.json` を作成すると、以下の機能が使えます。
@@ -273,8 +329,14 @@ watashi_log_decision:
273
329
  | `watashi_log_decision` | 意思決定を構造的に記録 |
274
330
  | `watashi_log_episode` | エピソード(問題→決定→結果→教訓)を記録 |
275
331
  | `watashi_store_knowledge` | Theory/Insight/Model を記録 |
276
- | `watashi_store_user_memo` | Memo/Plan/Issue/Discussion を記録 |
277
- | `watashi_update_user_memo` | Memo/Plan/Issue/Discussion を更新 |
332
+ | `watashi_store_user_memo` | 参照用メモを記録 |
333
+ | `watashi_update_user_memo` | メモを更新 |
334
+ | `watashi_store_user_plan` | チェックリスト型の作業計画を記録 |
335
+ | `watashi_update_user_plan` | 作業計画のメタ情報を更新 |
336
+ | `watashi_check_user_plan` | チェックリスト項目を済にする(全項目済で自動完了) |
337
+ | `watashi_store_user_issue` | 課題・議論を記録 |
338
+ | `watashi_update_user_issue` | 課題のメタ情報を更新 |
339
+ | `watashi_comment_user_issue` | 課題にタイムスタンプ付きコメントを追記 |
278
340
  | `watashi_maintain` | DB保守(統計・バックアップ・エクスポート・棚卸・Store管理) |
279
341
 
280
342
  ---
@@ -17,34 +17,68 @@ description: >
17
17
  - `watashi_search(entity_types=["decision"], limit=50)`: active Decision一覧
18
18
  - `watashi_search(entity_types=["insight"], limit=20)`: 既存Insight(重複回避用)
19
19
 
20
- ### Step 2: パターン分析と蒸留
20
+ ### Step 2: クラスタリング
21
21
  収集したEpisode/Decisionから以下を分析:
22
22
 
23
- 1. **繰り返しテーマの検出**: 複数のEpisodeに共通するトピック・問題パターン
24
- 2. **原則の統合**: 個別Episodeの l2_principles を横断分析し、汎用的な原則を抽出
25
- 3. **既存Insightとの照合**: 重複・矛盾がないか確認
23
+ 1. **類似Episodeのグループ化**: トピック・問題パターンが共通するEpisodeをクラスタにまとめる
24
+ 2. **各クラスタに仮タイトルを付ける**: 「〜に関する問題群」のように命名
25
+ 3. **既存Insightとの照合**: 既にカバーされているクラスタは除外
26
26
 
27
- 分析結果に基づき生成:
28
- - **Insight**: 具体的で再利用可能な知見(1つのパターン)
29
- → `watashi_store_knowledge(kind='insight', supporting_episode_ids=[...])`
30
- - **Theory**: 体系的なフレームワーク(複数パターンの統合)
31
- → `watashi_store_knowledge(kind='theory', supporting_episode_ids=[...])`
27
+ 素材が5件未満、またはクラスタが形成できない場合は蒸留を見送り、蓄積を促す。
32
28
 
33
- l2_trigger_conditions(いつ適用するか)と l2_resolution_steps(具体的に何をするか)を必ず記入すること。
34
- 「まとめただけ」にならないよう、「次に同じ状況になったときの行動が変わる」レベルの知見を目指す。
29
+ ### Step 3: 探索軸による分析(蒸留の核心)
30
+ 各クラスタに対して、以下の観点で**すべて検討**する:
35
31
 
36
- ### Step 3: グルーミング済みマーク
32
+ | 探索軸 | 問い | 例 |
33
+ |--------|------|----|
34
+ | **手順化** | チェックリストで防げるか? | 「カラム追加時の確認事項」 |
35
+ | **自動化** | コード・ツール・lintで検出できるか? | 「CI でカラム順チェック」 |
36
+ | **ルール化** | 制約・規約として定義できるか? | 「命名規則: device = デバイス」 |
37
+ | **検出強化** | テスト・レビューで拾えるか? | 「スキーマテストに含める」 |
38
+ | **不要** | 個別対応で十分か? | 「再発可能性が低い一過性の問題」 |
39
+
40
+ 各軸について「適用可能」か「不要(理由)」を判定する。
41
+ **同じ種類の発想を繰り返さない**こと。各軸は異なる視点からのアプローチ。
42
+
43
+ ### Step 4: Insight/Theory 案の構成と提案
44
+ 分析結果から最適な形を選び、以下の形式でユーザーに提案する。
45
+ **書き込む前に必ずユーザーの確認を得ること。**
46
+
47
+ ```
48
+ ### 蒸留提案 #1
49
+ **種別**: Insight / Theory
50
+ **タイトル**: [具体的で検索しやすいタイトル]
51
+ **出典Episode**: [ID一覧 + 各タイトル]
52
+ **探索結果**:
53
+ - 手順化: [適用可能 — 理由] / [不要 — 理由]
54
+ - 自動化: [適用可能 — 理由] / [不要 — 理由]
55
+ - ルール化: [適用可能 — 理由] / [不要 — 理由]
56
+ - 検出強化: [適用可能 — 理由] / [不要 — 理由]
57
+ **採用した形式**: [手順化] ← なぜこれが最適かを一言で
58
+ **l2_trigger_conditions**: [いつ適用するか]
59
+ **l2_principles**: [行動可能な教訓 1〜3個]
60
+ **l2_resolution_steps**: [具体的な手順]
61
+
62
+ → このまま書き込みますか?修正がありますか?
63
+ ```
64
+
65
+ ユーザーが承認したら `watashi_store_knowledge` で書き込む。
66
+ 修正指示があれば反映してから書き込む。
67
+
68
+ 「まとめただけ」にならないよう、**「次に同じ状況になったときの行動が変わる」**レベルの知見を目指す。
69
+
70
+ ### Step 5: グルーミング済みマーク
37
71
  蒸留に使用したEpisodeをマーク:
38
72
  - `watashi_maintain(action='mark_groomed', episode_ids=[...])`
39
73
 
40
- ### Step 4: アーカイブ(ユーザー承認制)
74
+ ### Step 6: アーカイブ(ユーザー承認制)
41
75
  蒸留済みの古いレコードをアーカイブ(最新20件は維持):
42
76
  1. `watashi_maintain(action='archive_episodes', archive_keep_latest=20, dry_run=true)` でプレビュー
43
77
  2. 件数と対象をユーザーに提示し、承認を得る
44
78
  3. 承認後 `dry_run=false` で実行
45
79
  4. Decision も同様に実行
46
80
 
47
- ### Step 5: サマリー報告
81
+ ### Step 7: サマリー報告
48
82
 
49
83
  ## 出力形式
50
84
 
@@ -54,6 +88,7 @@ l2_trigger_conditions(いつ適用するか)と l2_resolution_steps(具体
54
88
  ### 分析した素材
55
89
  - Episode: X件(うち未グルーミング: Y件)
56
90
  - Decision: Z件
91
+ - クラスタ: N個
57
92
 
58
93
  ### 蒸留結果
59
94
  - 新規Insight: N件
@@ -68,5 +103,6 @@ l2_trigger_conditions(いつ適用するか)と l2_resolution_steps(具体
68
103
  ## 注意事項
69
104
  - 素材が5件未満の場合は蒸留を見送り、蓄積を促す
70
105
  - アーカイブは必ず dry_run でプレビュー → ユーザー承認後に実行
71
- - supporting_episode_ids を必ず設定する
106
+ - supporting_episode_ids を必ず設定する(2件以上で行動制約候補に昇格)
72
107
  - 既存のInsight/Theoryと重複する場合は統合を提案する
108
+ - **Insight/Theory/Model の書き込みは必ずユーザー確認後に行う**(通常記録と異なる)
@@ -15,15 +15,14 @@ watashi-db から過去のコンテキストを検索・参照します。
15
15
 
16
16
  ## 手順
17
17
 
18
- 1. **概要確認**: 引数なし、または初回利用時はまず `watashi_list_topics` で記録済みトピックの概要を確認する
18
+ 1. **概要確認**: 引数なし、または初回利用時はまず `watashi_get(entity_type='profile')` でプロファイルの全体像を確認する
19
19
 
20
20
  2. **トピック特定**: $ARGUMENTS または会話の文脈から検索キーワードを抽出
21
21
 
22
- 3. **検索実行**: 以下のツールを適切に使い分ける:
23
- - `watashi_list_topics`: 記録済みトピックの全体像(カテゴリ分布・タグ上位・最近の判断)
24
- - `watashi_query_context`: 幅広いトピック検索(Claims + Decisions + Episodes 横断)
25
- - `watashi_search_claims`: 特定カテゴリの好み・スキルを絞り込む場合
26
- - `watashi_get_context_pack`: トークン予算を指定した効率的な検索
22
+ 3. **検索実行**: `watashi_search` で全エンティティ横断検索を行う:
23
+ - `query`: 検索キーワード(自然言語可)
24
+ - `entity_types`: 絞り込む場合は `["claim"]`, `["episode"]` 等を指定
25
+ - `category`: Claim のカテゴリで絞り込む場合に指定(skill, preference 等)
27
26
 
28
27
  4. **結果の活用**:
29
28
  - 検索結果が0件なら何も報告しない(ユーザーの邪魔をしない)
@@ -9,10 +9,10 @@ description: 記録されたエピソードや意思決定を振り返り、パ
9
9
 
10
10
  ## 手順
11
11
 
12
- 1. **データ収集**: 以下のツールを並行して呼び出し、記録済みデータを取得する:
13
- - `watashi_list_episodes`: エピソード一覧(引数があればキーワードで絞り込み)
14
- - `watashi_list_decisions`: 意思決定一覧(引数があればキーワードで絞り込み)
15
- - `watashi_search_claims`: 関連するClaim(category: value, workflow を優先)
12
+ 1. **データ収集**: 以下の検索を並行して実行し、記録済みデータを取得する:
13
+ - `watashi_search(entity_types=['episode'], query=...)`: エピソード一覧(引数があればキーワードで絞り込み)
14
+ - `watashi_search(entity_types=['decision'], query=...)`: 意思決定一覧(引数があればキーワードで絞り込み)
15
+ - `watashi_search(entity_types=['claim'], category='value', query=...)`: 関連するClaim(value, workflow を優先)
16
16
 
17
17
  2. **パターン分析**: 取得したデータから以下のパターンを抽出する:
18
18
  - **繰り返し現れるテーマ**: 複数のエピソードに共通するトピック
@@ -10,15 +10,15 @@ description: ユーザーの好み・スキル・知識・価値観などをわ
10
10
  ## 手順
11
11
 
12
12
  1. **引数の解析**: `$ARGUMENTS` の内容を分析し、記録の種類を判別する:
13
- - **好み(preference)**: 「〜が好き」「〜を使いたい」→ `watashi_store_preference` を使用
13
+ - **好み(preference)**: 「〜が好き」「〜を使いたい」→ `watashi_store_claim` を使用(category: preference)
14
14
  - **スキル(skill)**: 「〜ができる」「〜を学んだ」→ `watashi_store_claim` を使用(category: skill)
15
15
  - **知識(knowledge)**: 「〜について知っている」→ `watashi_store_claim` を使用(category: knowledge)
16
16
  - **価値観(value)**: 「〜を大切にしている」→ `watashi_store_claim` を使用(category: value)
17
17
  - **ワークフロー(workflow)**: 「〜の手順で作業する」→ `watashi_store_claim` を使用(category: workflow)
18
18
  - **アイデンティティ(identity)**: 「〜として活動している」→ `watashi_store_claim` を使用(category: identity)
19
19
 
20
- 2. **重複チェック**: `watashi_search_claims` で類似する既存Claimがないか確認する。
21
- - 類似Claimが見つかった場合、更新(`watashi_update_claim`)または置き換え(`watashi_supersede_claim`)を提案する。
20
+ 2. **重複チェック**: `watashi_search(entity_types=['claim'], query=...)` で類似する既存Claimがないか確認する。
21
+ - 類似Claimが見つかった場合、更新(`watashi_update_claim`)を提案する。
22
22
 
23
23
  3. **記録実行**: 適切なツールで記録を行う。
24
24
  - `subject`: 通常は "user"
@@ -6,13 +6,13 @@ description: セッション開始時にユーザーのプロファイルとコ
6
6
 
7
7
  ## 手順
8
8
 
9
- 1. **プロファイル読み込み**: `watashi_get_profile_summary` を呼び出して、ユーザーの好み・スキル・価値観の全体像を取得する。
9
+ 1. **プロファイル読み込み**: `watashi_get(entity_type='profile')` を呼び出して、ユーザーの好み・スキル・価値観の全体像を取得する。
10
10
 
11
- 2. **関連コンテキスト取得**: `watashi_query_context` を呼び出して、現在のプロジェクトや作業に関連する直近のコンテキストを取得する。
11
+ 2. **関連コンテキスト取得**: `watashi_search` を呼び出して、現在のプロジェクトや作業に関連する直近のコンテキストを取得する。
12
12
  - scopeパラメータがあれば、プロジェクトスコープで絞り込む(例: `project:watashi-db`)
13
13
  - なければ `global` スコープで取得
14
14
 
15
- 3. **直近のエピソード確認**: `watashi_list_episodes` を呼び出して、最近記録されたエピソード(思考パターン・意思決定)を2〜3件取得する。
15
+ 3. **直近のエピソード確認**: `watashi_search(entity_types=['episode'], limit=3)` を呼び出して、最近記録されたエピソード(思考パターン・意思決定)を2〜3件取得する。
16
16
 
17
17
  4. **コンテキスト要約の提供**: 取得した情報をもとに、以下を含む簡潔な挨拶を行う:
18
18
  - ユーザーの主要な好み・作業スタイルの認識
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Bearer Token 認証
3
+ * 環境変数 WATASHI_AUTH_TOKEN が設定されている場合のみ有効。
4
+ * 未設定時は認証なし(ローカル開発用)。
5
+ */
6
+ export declare function validateRequest(authHeader: string | undefined): boolean;
7
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Bearer Token 認証
3
+ * 環境変数 WATASHI_AUTH_TOKEN が設定されている場合のみ有効。
4
+ * 未設定時は認証なし(ローカル開発用)。
5
+ */
6
+ export function validateRequest(authHeader) {
7
+ const expected = process.env.WATASHI_AUTH_TOKEN;
8
+ if (!expected)
9
+ return true; // トークン未設定 = 認証なし
10
+ if (!authHeader?.startsWith("Bearer "))
11
+ return false;
12
+ return authHeader.slice(7) === expected;
13
+ }
14
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/auth/token.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,eAAe,CAAC,UAA8B;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAC7C,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;AAC1C,CAAC"}
@@ -7,7 +7,7 @@ import { z } from "zod";
7
7
  /** 同期モード: read-write(双方向)/ write-only(バックアップ専用)/ read-only(受信専用) */
8
8
  export const SyncModeSchema = z.enum(["read-write", "write-only", "read-only"]);
9
9
  /** 同期設定 */
10
- // 2026-03-05 修正: generations を削除(B案移行によりスナップショットはclient_id別1ファイル上書き方式になり、世代管理は不要になった)
10
+ // 2026-03-05 修正: generations を削除(B案移行によりスナップショットはdevice_id別1ファイル上書き方式になり、世代管理は不要になった)
11
11
  // 2026-03-13 追加: mode フィールド(read-write / write-only / read-only)
12
12
  export const SyncConfigSchema = z.object({
13
13
  enabled: z.boolean().default(true),
@@ -1,20 +1,20 @@
1
1
  export declare const DB_DIR: string;
2
2
  export declare const DB_PATH: string;
3
+ export declare const DEV_DB_PATH: string;
3
4
  export declare const LEGACY_DB_PATH: string;
4
5
  export declare const CONFIG_PATH: string;
5
6
  export declare const BUSY_TIMEOUT_MS = 5000;
6
7
  export declare const SERVER_NAME = "watashi-db";
7
- export declare const SERVER_VERSION = "0.0.8";
8
+ export declare const SERVER_VERSION: string;
8
9
  export declare const CLAIM_CATEGORIES: readonly ["preference", "identity", "skill", "value", "workflow", "knowledge", "custom"];
9
10
  export declare const CLAIM_SCOPES: readonly ["global", "persona", "project", "tool", "temporal"];
10
- export declare const CLAIM_STATUSES: readonly ["active", "retracted", "superseded", "promoted"];
11
- export declare const DECISION_STATUSES: readonly ["active", "reversed", "obsolete", "archived", "promoted"];
12
- export declare const THEORY_STATUSES: readonly ["active", "archived", "promoted"];
13
- export declare const INSIGHT_STATUSES: readonly ["active", "archived", "promoted"];
14
- export declare const MODEL_STATUSES: readonly ["active", "archived", "promoted"];
15
- export declare const USER_MEMO_STATUSES: readonly ["active", "archived"];
11
+ export declare const VALIDITY_STATUSES: readonly ["active", "invalidated", "superseded"];
12
+ export declare const USER_MEMO_STATUSES: readonly ["active"];
16
13
  export declare const USER_MEMO_USAGE_POLICIES: readonly ["auto", "on_request", "human_directed"];
17
- export declare const USER_PLAN_STATUSES: readonly ["active", "completed", "archived"];
18
- export declare const USER_ISSUE_STATUSES: readonly ["open", "closed", "archived"];
14
+ export declare const USER_PLAN_STATUSES: readonly ["active", "completed"];
15
+ export declare const USER_ISSUE_STATUSES: readonly ["open", "closed"];
19
16
  export declare const USER_ISSUE_PRIORITIES: readonly ["low", "medium", "high", "critical"];
17
+ export declare const USER_FILE_STATUSES: readonly ["active"];
18
+ export declare const USER_TOPIC_STATUSES: readonly ["active", "closed"];
19
+ export declare const USER_TOPIC_PRIORITIES: readonly ["low", "medium", "high", "critical"];
20
20
  //# sourceMappingURL=constants.d.ts.map
package/dist/constants.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import path from "node:path";
2
2
  import os from "node:os";
3
+ import { createRequire } from "node:module";
3
4
  // DBファイル配置: ~/.watashi-db/default.db(ユーザーホーム配下、プロジェクト非依存)
4
5
  export const DB_DIR = path.join(os.homedir(), ".watashi-db");
5
6
  export const DB_PATH = path.join(DB_DIR, "default.db");
7
+ export const DEV_DB_PATH = path.join(DB_DIR, "develop.db");
6
8
  // 旧デフォルトDB名(自動リネームマイグレーション用)
7
9
  export const LEGACY_DB_PATH = path.join(DB_DIR, "watashi.db");
8
10
  // マルチStore設定ファイル
@@ -11,9 +13,10 @@ export const CONFIG_PATH = path.join(DB_DIR, "config.json");
11
13
  export const BUSY_TIMEOUT_MS = 5000;
12
14
  // MCPサーバー情報
13
15
  export const SERVER_NAME = "watashi-db";
14
- // 2026-02-11 修正: 実態に合わせてv0.0.1に変更(Codexレビュー指摘)
15
- // 元の実装: 0.1.0 としていたが、初期実装段階のため0.0.1が適切
16
- export const SERVER_VERSION = "0.0.8";
16
+ // 2026-03-19 修正: package.json から動的取得に変更(Codexレビュー指摘: バージョン不整合防止)
17
+ const _require = createRequire(import.meta.url);
18
+ const _pkg = _require("../package.json");
19
+ export const SERVER_VERSION = _pkg.version;
17
20
  // Claimのカテゴリ一覧
18
21
  export const CLAIM_CATEGORIES = [
19
22
  "preference", // 好み・設定
@@ -35,47 +38,21 @@ export const CLAIM_SCOPES = [
35
38
  "tool", // 特定ツールに適用(tool:<name>)
36
39
  "temporal", // 一時的に適用
37
40
  ];
38
- // Claimのステータス(削除せず履歴保持)
39
- export const CLAIM_STATUSES = [
41
+ // === Status正規化 (Issue #58) ===
42
+ // 原則: 1 status = 1 lifecycle。直交する概念は別カラムに分離。
43
+ // - validity_status: 有効性ライフサイクル (Knowledge系)
44
+ // - xxx_status: ドメイン固有ライフサイクル (User系)
45
+ // - is_archived: 可視性 (全テーブル共通、別カラム)
46
+ // - promoted_to: データ所在 (Knowledge系、別カラム)
47
+ // Knowledge系 共通の有効性ステータス
48
+ export const VALIDITY_STATUSES = [
40
49
  "active", // 有効
41
- "retracted", // 撤回済み
50
+ "invalidated", // 無効化(人間の判断で撤回)
42
51
  "superseded", // 後続に置き換え済み
43
- "promoted", // 別Storeへ昇格済み
44
52
  ];
45
- // 意思決定のステータス
46
- export const DECISION_STATUSES = [
47
- "active", // 有効
48
- "reversed", // 撤回済み
49
- "obsolete", // 廃止
50
- "archived", // アーカイブ済み(蒸留済み)
51
- "promoted", // 別Storeへ昇格済み
52
- ];
53
- // Theoryのステータス
54
- export const THEORY_STATUSES = [
55
- "active", // 有効
56
- "archived", // アーカイブ済み
57
- "promoted", // 別Storeへ昇格済み
58
- ];
59
- // 2026-02-23 追加 (Issue #40): Insightのステータス
60
- // Theoryから non_goals, open_questions を除外した軽量な知見エンティティ
61
- export const INSIGHT_STATUSES = [
62
- "active", // 有効
63
- "archived", // アーカイブ済み
64
- "promoted", // 別Storeへ昇格済み
65
- ];
66
- // 2026-02-23 追加 (Issue #40): Modelのステータス
67
- // 抽象的思考フレームワーク・メンタルモデルを記録するエンティティ
68
- export const MODEL_STATUSES = [
69
- "active", // 有効
70
- "archived", // アーカイブ済み
71
- "promoted", // 別Storeへ昇格済み
72
- ];
73
- // Issue #45: UserMemoのステータス
74
- // 2026-02-25 リネーム: MEMO_* → USER_MEMO_* (Issue #45 Phase 1)
75
- // 元の実装: MEMO_STATUSES / MEMO_USAGE_POLICIES として定義されていた
53
+ // UserMemoのドメインステータス
76
54
  export const USER_MEMO_STATUSES = [
77
55
  "active", // 有効
78
- "archived", // アーカイブ済み
79
56
  ];
80
57
  // Issue #45: UserMemoの可視性ポリシー
81
58
  export const USER_MEMO_USAGE_POLICIES = [
@@ -83,17 +60,15 @@ export const USER_MEMO_USAGE_POLICIES = [
83
60
  "on_request", // 検索時のみ表示
84
61
  "human_directed", // ユーザーが明示的に指示した場合のみ
85
62
  ];
86
- // Issue #57: UserPlanのステータス
63
+ // UserPlanのドメインステータス
87
64
  export const USER_PLAN_STATUSES = [
88
65
  "active", // 有効(進行中)
89
66
  "completed", // 完了
90
- "archived", // アーカイブ済み
91
67
  ];
92
- // Issue #57: UserIssueのステータス
68
+ // UserIssueのドメインステータス
93
69
  export const USER_ISSUE_STATUSES = [
94
70
  "open", // オープン
95
71
  "closed", // クローズ
96
- "archived", // アーカイブ済み
97
72
  ];
98
73
  // Issue #57: UserIssueの優先度
99
74
  export const USER_ISSUE_PRIORITIES = [
@@ -102,4 +77,15 @@ export const USER_ISSUE_PRIORITIES = [
102
77
  "high", // 高
103
78
  "critical", // 緊急
104
79
  ];
80
+ // UserFileのドメインステータス
81
+ export const USER_FILE_STATUSES = [
82
+ "active", // 有効
83
+ ];
84
+ // UserTopicのドメインステータス
85
+ export const USER_TOPIC_STATUSES = [
86
+ "active", // 活動中
87
+ "closed", // クローズ(議論完了)
88
+ ];
89
+ // UserTopicの優先度(USER_ISSUE_PRIORITIESと同一)
90
+ export const USER_TOPIC_PRIORITIES = USER_ISSUE_PRIORITIES;
105
91
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,7 @@ export function initializeArchiveDb(archivePath, cutoffDate) {
58
58
  session_id TEXT,
59
59
  source_tool TEXT,
60
60
  created_at TEXT NOT NULL,
61
- client_id TEXT
61
+ device_id TEXT
62
62
  );
63
63
  CREATE INDEX IF NOT EXISTS idx_archive_audit_created ON audit_log(created_at);
64
64
 
@@ -115,8 +115,8 @@ export function executeArchive(db, archivePath, cutoffDate, tables, provenance)
115
115
  const auditId = ulid();
116
116
  const now = new Date().toISOString();
117
117
  db.prepare(`
118
- INSERT INTO main.audit_log (id, operation, entity_type, entity_id, summary, details, client_name, client_version, session_id, source_tool, client_id, created_at)
119
- VALUES (@id, @operation, @entity_type, @entity_id, @summary, @details, @client_name, @client_version, @session_id, @source_tool, @client_id, @created_at)
118
+ INSERT INTO main.audit_log (id, operation, entity_type, entity_id, summary, details, client_name, client_version, session_id, source_tool, device_id, created_at)
119
+ VALUES (@id, @operation, @entity_type, @entity_id, @summary, @details, @client_name, @client_version, @session_id, @source_tool, @device_id, @created_at)
120
120
  `).run({
121
121
  id: auditId,
122
122
  operation: "archive",
@@ -132,10 +132,10 @@ export function executeArchive(db, archivePath, cutoffDate, tables, provenance)
132
132
  client_version: provenance?.client_version ?? null,
133
133
  session_id: provenance?.session_id ?? null,
134
134
  source_tool: "watashi_archive_logs",
135
- // 2026-03-03 追加 (V21): client_id
136
- client_id: (() => {
135
+ // 2026-03-03 追加 (V21): device_id
136
+ device_id: (() => {
137
137
  try {
138
- const row = db.prepare("SELECT value FROM store_meta WHERE key = 'client_id'").get();
138
+ const row = db.prepare("SELECT value FROM store_meta WHERE key = 'device_id'").get();
139
139
  return row?.value ?? null;
140
140
  }
141
141
  catch {
@@ -5,7 +5,7 @@ import { computeClaimScore } from "../scoring.js";
5
5
  * ただし全Claimを返す(score=0の健全なClaimも含む)。
6
6
  */
7
7
  export function getGroomingClaims(db, params) {
8
- const conditions = ["c.status = 'active'"];
8
+ const conditions = ["c.validity_status = 'active'", "c.is_archived = 0", "c.promoted_to IS NULL"];
9
9
  const values = {};
10
10
  if (params.scope) {
11
11
  conditions.push("c.scope = @scope");
@@ -155,8 +155,8 @@ export function getGroomingClaims(db, params) {
155
155
  */
156
156
  export function detectConflicts(db, params) {
157
157
  const conditions = [
158
- "c1.status = 'active'",
159
- "c2.status = 'active'",
158
+ "c1.validity_status = 'active'", "c1.is_archived = 0",
159
+ "c2.validity_status = 'active'", "c2.is_archived = 0",
160
160
  "c1.l2_subject = c2.l2_subject",
161
161
  "c1.l2_predicate = c2.l2_predicate",
162
162
  "c1.l2_object != c2.l2_object",
@@ -185,7 +185,7 @@ export function detectConflicts(db, params) {
185
185
  AND (SELECT COUNT(*) FROM claims c3
186
186
  WHERE c3.l2_subject = c1.l2_subject
187
187
  AND c3.l2_predicate = c1.l2_predicate
188
- AND c3.status = 'active') = 2
188
+ AND c3.validity_status = 'active' AND c3.is_archived = 0) = 2
189
189
  `).all(values);
190
190
  }
191
191
  /**
@@ -211,7 +211,7 @@ export function analyzeRetractImpact(db, claimId, maxDepth = 10) {
211
211
  c.l2_subject, c.l2_predicate, c.l2_object, c.category, c.scope, c.confidence
212
212
  FROM downstream d
213
213
  JOIN claims c ON c.id = d.claim_id
214
- WHERE c.status = 'active'
214
+ WHERE c.validity_status = 'active' AND c.is_archived = 0
215
215
  AND d.claim_id != @claim_id -- 循環依存でターゲット自身が含まれるのを防止
216
216
  ORDER BY d.depth, c.l2_subject
217
217
  `).all({ claim_id: claimId, max_depth: maxDepth });
@@ -1 +1 @@
1
- {"version":3,"file":"groom.js","sourceRoot":"","sources":["../../src/database/groom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"groom.js","sourceRoot":"","sources":["../../src/database/groom.ts"],"names":[],"mappings":"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"}