@pcircle/memesh 4.5.1 → 4.6.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/.claude-plugin/marketplace.json +5 -3
- package/.claude-plugin/plugin.json +6 -4
- package/AGENTS.md +95 -0
- package/README.de.md +129 -35
- package/README.md +161 -34
- package/README.zh-TW.md +130 -35
- package/dashboard/dist/index.html +10 -10
- package/dist/cli/view-live.js +3 -3
- package/dist/core/auto-tagger.d.ts.map +1 -1
- package/dist/core/auto-tagger.js +4 -9
- package/dist/core/auto-tagger.js.map +1 -1
- package/dist/core/briefing.d.ts +8 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +91 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/capture-flag.d.ts +5 -0
- package/dist/core/capture-flag.d.ts.map +1 -0
- package/dist/core/capture-flag.js +10 -0
- package/dist/core/capture-flag.js.map +1 -0
- package/dist/core/conflict-candidates.d.ts +20 -0
- package/dist/core/conflict-candidates.d.ts.map +1 -0
- package/dist/core/conflict-candidates.js +79 -0
- package/dist/core/conflict-candidates.js.map +1 -0
- package/dist/core/conflict-judge.d.ts +47 -0
- package/dist/core/conflict-judge.d.ts.map +1 -0
- package/dist/core/conflict-judge.js +189 -0
- package/dist/core/conflict-judge.js.map +1 -0
- package/dist/core/digest-validator.d.ts.map +1 -1
- package/dist/core/digest-validator.js +3 -5
- package/dist/core/digest-validator.js.map +1 -1
- package/dist/core/doctor.d.ts +2 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +34 -56
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +5 -2
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +108 -25
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/embedder.d.ts +5 -4
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +16 -8
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/failure-analyzer.d.ts.map +1 -1
- package/dist/core/failure-analyzer.js +7 -12
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/install-channel.d.ts +1 -1
- package/dist/core/install-channel.d.ts.map +1 -1
- package/dist/core/install-channel.js +16 -5
- package/dist/core/install-channel.js.map +1 -1
- package/dist/core/install-hooks.d.ts +5 -0
- package/dist/core/install-hooks.d.ts.map +1 -1
- package/dist/core/install-hooks.js +0 -0
- package/dist/core/install-hooks.js.map +1 -1
- package/dist/core/json-utils.d.ts +1 -0
- package/dist/core/json-utils.d.ts.map +1 -1
- package/dist/core/json-utils.js +19 -10
- package/dist/core/json-utils.js.map +1 -1
- package/dist/core/kg-backfill.d.ts +0 -1
- package/dist/core/kg-backfill.d.ts.map +1 -1
- package/dist/core/kg-backfill.js +0 -3
- package/dist/core/kg-backfill.js.map +1 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +14 -21
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/memory-tool.d.ts.map +1 -1
- package/dist/core/memory-tool.js +4 -4
- package/dist/core/memory-tool.js.map +1 -1
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +22 -13
- package/dist/core/operations.js.map +1 -1
- package/dist/core/prompt-safety.d.ts +1 -0
- package/dist/core/prompt-safety.d.ts.map +1 -1
- package/dist/core/prompt-safety.js +7 -0
- package/dist/core/prompt-safety.js.map +1 -1
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +31 -0
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/setup.d.ts +29 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +127 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/task-state-store.d.ts +17 -0
- package/dist/core/task-state-store.d.ts.map +1 -0
- package/dist/core/task-state-store.js +45 -0
- package/dist/core/task-state-store.js.map +1 -0
- package/dist/core/task-state.d.ts +19 -0
- package/dist/core/task-state.d.ts.map +1 -0
- package/dist/core/task-state.js +91 -0
- package/dist/core/task-state.js.map +1 -0
- package/dist/core/time-utils.d.ts +2 -0
- package/dist/core/time-utils.d.ts.map +1 -0
- package/dist/core/time-utils.js +14 -0
- package/dist/core/time-utils.js.map +1 -0
- package/dist/core/title.d.ts +5 -0
- package/dist/core/title.d.ts.map +1 -0
- package/dist/core/title.js +14 -0
- package/dist/core/title.js.map +1 -0
- package/dist/core/transcript-source.d.ts.map +1 -1
- package/dist/core/transcript-source.js +2 -3
- package/dist/core/transcript-source.js.map +1 -1
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/work-topology.d.ts +33 -0
- package/dist/core/work-topology.d.ts.map +1 -0
- package/dist/core/work-topology.js +183 -0
- package/dist/core/work-topology.js.map +1 -0
- package/dist/db.d.ts +2 -7
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +144 -284
- package/dist/db.js.map +1 -1
- package/dist/knowledge-graph.d.ts +1 -0
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +50 -40
- package/dist/knowledge-graph.js.map +1 -1
- package/dist/skills-manifest.json +48 -18
- package/dist/storage/conflicts.d.ts.map +1 -1
- package/dist/storage/conflicts.js +2 -7
- package/dist/storage/conflicts.js.map +1 -1
- package/dist/storage/fts-index.d.ts +4 -2
- package/dist/storage/fts-index.d.ts.map +1 -1
- package/dist/storage/fts-index.js +16 -4
- package/dist/storage/fts-index.js.map +1 -1
- package/dist/storage/schema.d.ts +20 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +274 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/transports/cli/cli.d.ts +1 -4
- package/dist/transports/cli/cli.d.ts.map +1 -1
- package/dist/transports/cli/cli.js +382 -6
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +208 -307
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +46 -0
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +57 -2
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +21 -10
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +26 -8
- package/dist/transports/schemas.js.map +1 -1
- package/llms-install.md +138 -0
- package/package.json +14 -9
- package/scripts/hooks/_generated/capture-flag.js +17 -0
- package/scripts/hooks/_generated/fts-index.js +16 -4
- package/scripts/hooks/_generated/schema.js +281 -0
- package/scripts/hooks/_generated/task-state.js +98 -0
- package/scripts/hooks/_generated/time-utils.js +21 -0
- package/scripts/hooks/_generated/title.js +21 -0
- package/scripts/hooks/_generated/work-topology.js +190 -0
- package/scripts/hooks/_shared.js +122 -478
- package/scripts/hooks/post-commit.js +4 -1
- package/scripts/hooks/pre-compact.js +13 -1
- package/scripts/hooks/pre-edit-recall.js +5 -3
- package/scripts/hooks/session-start.js +135 -59
- package/scripts/hooks/session-summary.js +59 -24
- package/skills/memesh/SKILL.md +97 -76
- package/README.es.md +0 -467
- package/README.fr.md +0 -459
- package/README.ja.md +0 -467
- package/README.ko.md +0 -467
- package/README.pt.md +0 -459
- package/README.th.md +0 -460
- package/README.vi.md +0 -459
- package/README.zh-CN.md +0 -466
- package/dist/cli/view.d.ts +0 -3
- package/dist/cli/view.d.ts.map +0 -1
- package/dist/cli/view.js +0 -523
- package/dist/cli/view.js.map +0 -1
package/README.ja.md
DELETED
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
🌐 [English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Português](README.pt.md) | [Français](README.fr.md) | [Deutsch](README.de.md) | [Tiếng Việt](README.vi.md) | [Español](README.es.md) | [ภาษาไทย](README.th.md)
|
|
2
|
-
|
|
3
|
-
<p align="center">
|
|
4
|
-
<h1 align="center">MeMesh LLM Memory</h1>
|
|
5
|
-
<p align="center">
|
|
6
|
-
<strong>Claude Code と MCP コーディングエージェント向けのローカルメモリ</strong><br />
|
|
7
|
-
SQLite ファイル 1 つ。Docker も クラウドも不要。
|
|
8
|
-
</p>
|
|
9
|
-
<p align="center">
|
|
10
|
-
<a href="https://www.npmjs.com/package/@pcircle/memesh"><img src="https://img.shields.io/npm/v/@pcircle/memesh?style=flat-square&color=3b82f6&label=npm" alt="npm" /></a>
|
|
11
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e?style=flat-square" alt="MIT" /></a>
|
|
12
|
-
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D22-22c55e?style=flat-square" alt="Node" /></a>
|
|
13
|
-
<a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-a855f7?style=flat-square" alt="MCP" /></a>
|
|
14
|
-
</p>
|
|
15
|
-
</p>
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
> [!IMPORTANT]
|
|
20
|
-
> **活発に開発中のプロジェクト** — 機能は継続的に更新され、リリース間で変更される可能性があります。バグや機能要望がある場合は[issue を開いてください](https://github.com/PCIRCLE-AI/memesh-llm-memory/issues)。
|
|
21
|
-
|
|
22
|
-
## 課題
|
|
23
|
-
|
|
24
|
-
コーディングエージェントはセッション間で記憶を失います。アーキテクチャの決定、バグ修正、テスト失敗、苦労して得た教訓 — すべてを毎回説明し直さなければなりません。Claude Code はいつも初期状態から始まり、既に知っているはずの制約を再発見し、貴重なコンテキストを無駄にします。
|
|
25
|
-
|
|
26
|
-
**MeMesh は、コーディングエージェントに永続的で検索可能な進化するローカルメモリを与えます。**
|
|
27
|
-
|
|
28
|
-
このパッケージは MeMesh プロダクトファミリーのローカルメモリ層です。意図的にシンプルでオープンソース設計になっています。npm でインストール、メモリを `~/.memesh/knowledge-graph.db` に保存、Claude Code や MCP 互換クライアントに接続するだけ。ホステッドワークスペースやエンタープライズ向けのプロダクトは、このパッケージの README やロードマップとは分離して提供されます。
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## エビデンス — LongMemEval-S で 95.60% R@5
|
|
33
|
-
|
|
34
|
-
MeMesh の検索エンジンは **FTS5 のみ**(LLM もホットパスのエンベディングも使用しない)で、公開されている [LongMemEval-S](https://huggingface.co/datasets/xiaowu0162/longmemeval) ベンチマーク(500 問、MIT ライセンス)で測定された結果です:
|
|
35
|
-
|
|
36
|
-
| システム | R@5 | ソース |
|
|
37
|
-
|---|---|---|
|
|
38
|
-
| **MeMesh (Mode A, via `recallEnhanced()`)** | **95.60%** | [benchmarks/longmemeval/RESULTS.md](benchmarks/longmemeval/RESULTS.md) |
|
|
39
|
-
| MemPalace | 96.6% | ベンダー自社申告 |
|
|
40
|
-
| Supermemory | ~82% | ベンダー推定値 |
|
|
41
|
-
| Zep | 63.8% | LongMemEval 論文 |
|
|
42
|
-
| Mem0 | 49.0% | LongMemEval 論文 |
|
|
43
|
-
|
|
44
|
-
再現コマンド、データセット SHA256、問題ごとの生結果、既知失敗の分析はすべて [`benchmarks/longmemeval/`](benchmarks/longmemeval/) にあります。約 10 秒で再実行可能です。
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## インストールパス早見表
|
|
49
|
-
|
|
50
|
-
MeMesh には**共存する 2 つのインストールパス**があります。ほとんどのユーザーは両方が必要です。両者は**同じメモリデータベース**(`~/.memesh/knowledge-graph.db`)に書き込むため、Claude Code チャットで捕捉した記憶がシェルにも反映され、逆も同様です。
|
|
51
|
-
|
|
52
|
-
```mermaid
|
|
53
|
-
flowchart TB
|
|
54
|
-
classDef client fill:#1f2937,stroke:#4b5563,color:#f9fafb,stroke-width:1px
|
|
55
|
-
classDef pathA fill:#1e3a8a,stroke:#3b82f6,color:#eff6ff,stroke-width:2px
|
|
56
|
-
classDef pathB fill:#14532d,stroke:#22c55e,color:#f0fdf4,stroke-width:2px
|
|
57
|
-
classDef db fill:#7c2d12,stroke:#f97316,color:#fff7ed,stroke-width:2px
|
|
58
|
-
|
|
59
|
-
subgraph clients["Where you use memesh from"]
|
|
60
|
-
direction LR
|
|
61
|
-
CC["Claude Code<br/>(chat + agent)"]:::client
|
|
62
|
-
TERM["Terminal / other<br/>MCP clients<br/>(Cursor, Cline...)"]:::client
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
subgraph paths["Two install paths"]
|
|
66
|
-
direction LR
|
|
67
|
-
A["<b>Path A — /plugin install</b><br/>───────────────<br/>Lives in <code>~/.claude/plugins/</code><br/><br/>• MCP tools in chat<br/>• Auto-capture hooks<br/>• <code>/memesh</code> skill<br/>• Session-start banner"]:::pathA
|
|
68
|
-
B["<b>Path B — npm install -g</b><br/>───────────────<br/>Lives in <code>$(npm prefix -g)/bin/</code><br/><br/>• <code>memesh</code> shell command<br/>• <code>memesh-mcp</code>, <code>-http</code>, <code>-view</code> bins<br/>• For Cursor / Cline / other MCP"]:::pathB
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
DB[("Shared memory DB<br/><code>~/.memesh/knowledge-graph.db</code><br/>Same data, both paths see it")]:::db
|
|
72
|
-
|
|
73
|
-
CC -->|uses| A
|
|
74
|
-
TERM -->|uses| B
|
|
75
|
-
A --> DB
|
|
76
|
-
B --> DB
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**どちらが必要?**
|
|
80
|
-
|
|
81
|
-
| やりたいこと | インストールパス |
|
|
82
|
-
|---|---|
|
|
83
|
-
| Claude Code の会話で `/memesh` skill を使う | Path A(プラグイン)|
|
|
84
|
-
| Claude Code で自動キャプチャ(session → 学習 → 次回リコール) | Path A(プラグイン)|
|
|
85
|
-
| ターミナルで `memesh remember` / `memesh recall` / `memesh doctor` を実行 | Path B(npm-global)|
|
|
86
|
-
| `memesh serve` でダッシュボードを直接起動(`npx` 起動遅延なし) | Path B(npm-global)|
|
|
87
|
-
| `memesh-mcp` を Cursor、Cline、その他の MCP クライアントに接続 | Path B(npm-global)|
|
|
88
|
-
| すべて | **両方インストール** — 競合しません |
|
|
89
|
-
|
|
90
|
-
> **よくある誤解**:Claude Code のプラグインは **`memesh` をシェルの `PATH` には追加しません**。`/plugin install` だけを実行して、ターミナルで `memesh reindex` と打つと `command not found` が出ます。これは仕様です — シェルコマンドを使うには `npm install -g @pcircle/memesh` も必要です。
|
|
91
|
-
|
|
92
|
-
### ⚠️ プラグインのインストールでは CLI は入りません
|
|
93
|
-
|
|
94
|
-
最もよくある混乱です。一度読んでおけば、後で時間を節約できます:
|
|
95
|
-
|
|
96
|
-
- Claude Code 内で `/plugin install memesh@pcircle-memesh` → **Path A のみ**インストール。MCP ツール、hooks、`/memesh` skill が手に入ります。`memesh` はシェルの `PATH` には**入りません**。
|
|
97
|
-
- ターミナルで `memesh reindex` / `memesh update` / `memesh doctor` → **Path B**(npm-global)が必要。なければ `zsh: command not found: memesh`。
|
|
98
|
-
- **Claude Code ユーザーへの推奨セットアップ**:**両方インストール**。共存し、同じデータベースを共有し、競合しません。
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
# /plugin install ... の後、これも実行:
|
|
102
|
-
npm install -g @pcircle/memesh
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Claude Code の会話だけで memesh を使う場合(ターミナルで `memesh` を打たない場合)、Path A だけで十分です。それ以外の方は両方インストールしてください。
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## 60 秒で始める
|
|
110
|
-
|
|
111
|
-
### オプション A — Claude Code プラグイン(ワンライナーインストール)
|
|
112
|
-
|
|
113
|
-
Claude Code を使っている場合、CLI 内から MeMesh をプラグインとしてインストールできます:
|
|
114
|
-
|
|
115
|
-
```
|
|
116
|
-
/plugin marketplace add PCIRCLE-AI/memesh-llm-memory
|
|
117
|
-
/plugin install memesh@pcircle-memesh
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Claude Code がフック、スキル、MCP サーバーを自動的にワイヤリングします。セッション内自動キャプチャ、プロアクティブリコール、Claude Code 会話内の `/memesh` スキル(remember / recall / learn / forget)、エージェント向け MCP ツールとしての `remember` / `recall` / `forget` / `learn` がすべて使えるようになります。CLI とローカルダッシュボードもグローバルインストールなしで完全にアクセス可能です — `npx @pcircle/memesh <command>` であらゆる CLI コマンドが実行でき、`npx @pcircle/memesh` で `localhost:3737` のダッシュボードが起動します。MCP サーバーはプラグイン同梱のコンパイル済みコードから直接起動します — `npx` ルックアップ、`npm install -g`、ビルド手順はいずれも不要です。memesh は Node 本体に含まれる `node:sqlite`(22.13+)にデータを保存するため、Node をアップグレードしても誤ったランタイム向けにビルドされたバイナリが残ることはありません。
|
|
121
|
-
|
|
122
|
-
### オプション B — npm グローバル(オプションの最適化)
|
|
123
|
-
|
|
124
|
-
シェルの `PATH` にバイナリを直接配置したい場合(`memesh`、`memesh-mcp` 等が任意のターミナルで `npx` ルックアップなしに動作)、または `memesh-mcp` を **Claude Code 以外の MCP クライアント**(Cursor、Cline、ターミナル専用フロー)に固定パスの stdio コマンドとして公開したい場合:
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
npm install -g @pcircle/memesh
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
> **初回インストールに関する注意(一度きり):**
|
|
131
|
-
> - **コンパイラは不要** — データベースエンジンは Node 自身の `node:sqlite` です。意味による検索を担う `sqlite-vec` は macOS (arm64/x64)、Linux (x64/arm64)、Windows x64 向けにビルド済みファイルとして提供されます。それ以外のプラットフォームでは単に存在せず、リコールはキーワード検索のままです。ここではインストールスクリプトを実行するものが一切ないため、`npm install --ignore-scripts` でも完全に動作する memesh がインストールされます。
|
|
132
|
-
> - **セマンティック検索は任意** — デフォルトの検索パスはキーワード検索(FTS5)で、モデルもダウンロードも不要です。意味ベースの検索にはエンベダーが必要です: ローカルで [Ollama](https://ollama.com) を動かすか、クラウドのエンベダーを設定してください(下の「エンベディング」参照)。設定がなければ memesh はキーワード検索のみを使います。
|
|
133
|
-
|
|
134
|
-
### ステップ 1.5: MeMesh を Claude Code に接続(npm パスのみ)
|
|
135
|
-
|
|
136
|
-
**オプション A**(`/plugin install memesh@pcircle-memesh`)でインストールした場合はこのステップをスキップしてください — Claude Code がプラグインフックを自動的にワイヤリングします。
|
|
137
|
-
|
|
138
|
-
**オプション B**(`npm install -g`)でインストールした場合、CLI は PATH に配置され MCP サーバーは登録されますが、Claude Code セッションフックは自動的にはワイヤリングされません。フックがないと `memesh remember` / `recall` は手動で使えますが、**自動キャプチャループ**(セッション → レッスン → 次のセッションで自発的にリコール)はサイレントになります。
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
memesh install-hooks # ~/.claude/settings.json に memesh フックを追加
|
|
142
|
-
memesh doctor # "Hooks wired into Claude Code" が PASS になることを確認
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
これらのフックは既存の `~/.claude/hooks/` カスタムフックと共存します — `install-hooks` は追加方式で書き込み、既存のものを上書きしません。削除する場合: `memesh uninstall-hooks`。
|
|
146
|
-
|
|
147
|
-
### ステップ 2: 決定を記録
|
|
148
|
-
|
|
149
|
-
> 以下の bash 例は `memesh` が `PATH` 上にあること(オプション B)を前提にしています。オプション A(プラグイン専用)のユーザーには等価な 2 つのパスがあります: Claude Code 会話内で尋ねる(`/memesh` スキル + MCP ツールが同じフローをカバー)か、任意のシェルで `memesh` を `npx @pcircle/memesh` に置き換える — フラグは同じで、グローバルインストール不要です。
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
memesh remember "Use OAuth 2.0 with PKCE for the new auth"
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
または、後でフィルタリングしたい場合に安定した名前と型を付ける明示形式:
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
memesh remember --name "auth-decision" --type "decision" --obs "Use OAuth 2.0 with PKCE"
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### ステップ 3: あとで思い出す
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
memesh recall "login security"
|
|
165
|
-
# → 別の単語で検索しても「OAuth 2.0 with PKCE」が見つかります
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**これだけです。** MeMesh がセッション間でメモリを保持・検索し始めます。
|
|
169
|
-
|
|
170
|
-
インストールと接続をエンドツーエンドで確認したい場合:
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
memesh doctor
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
ダッシュボードを開いてメモリを探索します:
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
memesh serve
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
<p align="center">
|
|
183
|
-
<img src="docs/images/dashboard-search.png" alt="MeMesh Search — any memory instantly" width="100%" />
|
|
184
|
-
</p>
|
|
185
|
-
|
|
186
|
-
<p align="center">
|
|
187
|
-
<img src="docs/images/dashboard-analytics.png" alt="MeMesh Analytics — health score, timeline, patterns, knowledge coverage" width="100%" />
|
|
188
|
-
</p>
|
|
189
|
-
|
|
190
|
-
<p align="center">
|
|
191
|
-
<img src="docs/images/dashboard-graph.png" alt="MeMesh Graph — interactive knowledge graph with type filters and ego mode" width="100%" />
|
|
192
|
-
</p>
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## こんな方向けです
|
|
197
|
-
|
|
198
|
-
| あなたが... | MeMesh でできること |
|
|
199
|
-
|-----------|-----------------|
|
|
200
|
-
| **Claude Code を使う開発者** | プロジェクト判断、ファイル固有の知見、過去の失敗が自動で呼び出される |
|
|
201
|
-
| **コーディングエージェントのパワーユーザー** | 1 つのローカルメモリレイヤーを MCP 互換ツール全体で共有 |
|
|
202
|
-
| **AI コーディングワークフローを実験中のチーム** | ホステッドインフラを導入せず、プロジェクト知識をエクスポート・インポート |
|
|
203
|
-
| **エージェント開発者** | MCP、HTTP、CLI 経由でローカルメモリを追加 |
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## コーディングエージェント向けに設計
|
|
208
|
-
|
|
209
|
-
<table>
|
|
210
|
-
<tr>
|
|
211
|
-
<td width="33%" align="center">
|
|
212
|
-
|
|
213
|
-
**Claude Code / Desktop**
|
|
214
|
-
```bash
|
|
215
|
-
memesh-mcp
|
|
216
|
-
```
|
|
217
|
-
MCP ツール + Claude Code フック
|
|
218
|
-
|
|
219
|
-
</td>
|
|
220
|
-
<td width="33%" align="center">
|
|
221
|
-
|
|
222
|
-
**HTTP クライアント**
|
|
223
|
-
```bash
|
|
224
|
-
curl localhost:3737/v1/recall \
|
|
225
|
-
-H "Content-Type: application/json" \
|
|
226
|
-
-d '{"query":"auth"}'
|
|
227
|
-
```
|
|
228
|
-
`memesh serve` (REST API)
|
|
229
|
-
|
|
230
|
-
</td>
|
|
231
|
-
<td width="33%" align="center">
|
|
232
|
-
|
|
233
|
-
**任意の LLM (OpenAI 形式)**
|
|
234
|
-
```bash
|
|
235
|
-
memesh export-schema \
|
|
236
|
-
--format openai
|
|
237
|
-
```
|
|
238
|
-
ツールを任意の API 呼び出しに貼り付け可能
|
|
239
|
-
|
|
240
|
-
</td>
|
|
241
|
-
</tr>
|
|
242
|
-
</table>
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
## OpenMemory、Cursor Memories、Mem0、Zep との違い
|
|
247
|
-
|
|
248
|
-
| | **MeMesh** | OpenMemory | Cursor Memories | Mem0 | Zep / Graphiti |
|
|
249
|
-
|---|---|---|---|---|---|
|
|
250
|
-
| **最適な用途** | コーディングエージェント向けローカルメモリ | ローカル・クロスクライアント MCP メモリ | Cursor ネイティブプロジェクトメモリ | 管理型アプリ・エージェントメモリ | テンポラル知識グラフ |
|
|
251
|
-
| **インストール形態** | `npm install -g @pcircle/memesh` | ローカルアプリ・サーバーフロー | Cursor ビルトイン | クラウド API / SDK / MCP | サービス・フレームワークセットアップ |
|
|
252
|
-
| **ストレージ** | 1 つのローカル SQLite ファイル | ローカルメモリスタック | Cursor 管理ルール・メモリ | ホステッド・セルフホスト型スタック | グラフデータベース |
|
|
253
|
-
| **クラウド必須** | いいえ | ローカルモードなら不要 | Cursor アカウント設定による | プラットフォーム利用時は必須 | 通常は必須・セルフホスト可能 |
|
|
254
|
-
| **Claude Code フック** | 第一級 | MCP ツール | いいえ | MCP ツール | Claude Code 専用ではない |
|
|
255
|
-
| **ダッシュボード** | ビルトイン | ビルトイン | Cursor 設定 | プラットフォームダッシュボード | プラットフォーム・グラフツール |
|
|
256
|
-
| **トレードオフ** | シンプルなローカル構成、エンタープライズスケールは非対応 | より広いローカルアプリフットプリント | Cursor に限定 | 強力な管理プラットフォーム、ローカルファースト性が低い | 強力なグラフモデル、セットアップが重い |
|
|
257
|
-
|
|
258
|
-
**MeMesh は、エンタープライズスケールの管理インフラストラクチャと引き換えに、即座のローカルセットアップ、検査可能なストレージ、コーディングエージェントワークフロー統合を選びました。**
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## Claude Code での自動動作
|
|
263
|
-
|
|
264
|
-
すべてを手動で記録する必要はありません。MeMesh に **6 つのフック** があり、作業中に知識を自動キャプチャ・注入します:
|
|
265
|
-
|
|
266
|
-
| タイミング | MeMesh の動作 |
|
|
267
|
-
|---------|-----------|
|
|
268
|
-
| **セッション開始時** | 最も関連の高いメモリ + 過去の教訓から得た予防警告をロード |
|
|
269
|
-
| **ファイル編集前** | ファイルまたはプロジェクト関連のメモリをリコール (Claude がコード執筆前) |
|
|
270
|
-
| **記憶を依頼したとき** | "remember this" / "guardar en memesh" / "sauvegarder dans memesh" / "記下來" の意図(5 言語)を検出し、Claude に memesh 使用をリマインド |
|
|
271
|
-
| **`git commit` 後** | 変更内容と diff 統計を記録 |
|
|
272
|
-
| **Claude 停止時** | 編集ファイル、修正エラー、失敗から自動生成した構造化教訓をキャプチャ |
|
|
273
|
-
| **コンテキスト圧縮前** | コンテキスト限界で失われる前に知識を保存 |
|
|
274
|
-
|
|
275
|
-
> **いつでも無効化可能:** `export MEMESH_AUTO_CAPTURE=false`
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 設定
|
|
280
|
-
|
|
281
|
-
すべての設定は環境変数経由です。デフォルトはローカル専用・ネットワークなしで、何も設定せずに動作するシステムが手に入ります。
|
|
282
|
-
|
|
283
|
-
| 変数 | デフォルト | 動作 |
|
|
284
|
-
|---|---|---|
|
|
285
|
-
| `MEMESH_DB_PATH` | `~/.memesh/knowledge-graph.db` | SQLite データベースの保存場所を上書き。 |
|
|
286
|
-
| `MEMESH_AUTO_CAPTURE` | `true` | 自動キャプチャフック(`Stop`、`PreCompact`)を完全に無効化。 |
|
|
287
|
-
| `MEMESH_AUTO_DETECT_LLM` | 未設定(自動検出**オン**) | `0` に設定すると、シェル環境で見つかった API キーを memesh が使用しなくなります。デフォルトでは、`ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `OLLAMA_HOST` が設定されていて `~/.memesh/config.json` にプロバイダを構成していない場合、memesh は書き込み側の LLM 機能(統合、レッスン抽出、自動タグ付け、dream)にそれを使用します。エンベディングは影響を受けません — `embedder.provider` を `ollama` または `openai` に明示設定しない限りキーワードのみ(FTS5)のままです。 |
|
|
288
|
-
| `MEMESH_AUTO_UPDATE` | `off` | 自動更新ポリシー。`off`(デフォルト)は自動更新を行いません。`patch` は `X.Y.Z → X.Y.Z+N` を許可、`minor` は `X.Y.Z → X.Y+1.0` を追加、`major` は任意のバンプを許可。許可されている場合、デタッチ実行された `npm install -g` がセッション終了時(Stop フック)に発火するため作業をブロックしません — 結果は `~/.memesh/auto-update.log` に記録されます。`~/.memesh/config.json` の `autoUpdate` でも設定可能(env が優先)。インストール済みバージョンがメンテナーによって非推奨化された場合(セキュリティアドバイザリ)、`off` でも `patch` は強制的に許可されます — minor / major バンプはサイレントな挙動変化を避けるため手動のままです。 |
|
|
289
|
-
| `OPENAI_API_KEY` | 未設定 | OpenAI のキー。`MEMESH_AUTO_DETECT_LLM=0` を設定するか、明示的にプロバイダを設定しない限り、LLM 機能で自動的に使用されます。 |
|
|
290
|
-
| `OLLAMA_HOST` | `http://localhost:11434` | ローカル Ollama プロバイダ使用時の Ollama エンドポイントを上書き。 |
|
|
291
|
-
|
|
292
|
-
`memesh doctor` は解決された設定を表示するため、何が有効かを確認できます。
|
|
293
|
-
|
|
294
|
-
**フォールバック LLM プロバイダー(Smart Mode)。** dashboard の **Settings → 「Fallback providers」** で、順序付きのフェイルオーバーチェーンを設定できます——プライマリのプロバイダーがダウンしたとき、memesh はリストの次のものを順に試します。ローカルの [Ollama](https://ollama.com) フォールバックや、クラウド(OpenAI / Anthropic、API キーが必要)を追加できます。プライバシーのトレードオフ:クラウドのフォールバックが使われると、メモリのテキスト(プライベートなこともあります)がそのプロバイダーに送られます。プライバシーのためにローカルのみで運用している場合は注意してください。
|
|
295
|
-
|
|
296
|
-
npm がインストール済みバージョンを非推奨としてフラグした場合(典型的にはセキュリティアドバイザリ)、次のセッション開始時に強い `⚠️ MeMesh <ver> is DEPRECATED` バナーが先頭に表示され、`memesh update-status` がアップグレードまで同じ行を表示し続けます。チェックは `~/.memesh/update-check.<version>.json` にキャッシュされ、一時的なネットワーク障害で警告が薄まらないようになっています。
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## ダッシュボード
|
|
301
|
-
|
|
302
|
-
8 つのタブ、11 言語対応、外部依存なし。サーバー実行中は `http://localhost:3737/dashboard` でアクセス可能。
|
|
303
|
-
|
|
304
|
-
| タブ | 表示内容 |
|
|
305
|
-
|-----|--------|
|
|
306
|
-
| **Insights** | メモリインサイト — dreamer エンジンによる週次サマリーとパターン提案。ワンクリックで承認・拒否 |
|
|
307
|
-
| **Search** | 全メモリ対象の全文検索 + ベクトル類似度検索 |
|
|
308
|
-
| **Browse** | ページネーション表示された全エンティティ、アーカイブ・復元機能 |
|
|
309
|
-
| **Analytics** | メモリ健全性スコア、30 日間タイムライン、PM ベロシティ + KG 接続性指標、作業パターン、クリーンアップ提案 |
|
|
310
|
-
| **Graph** | インタラクティブ力指向知識グラフ、型フィルタ、検索、エゴモード、再度ヒートマップ |
|
|
311
|
-
| **Lessons** | 過去の失敗から構造化された教訓 (エラー、根本原因、修正、予防) |
|
|
312
|
-
| **Manage** | エンティティのアーカイブ・復元 |
|
|
313
|
-
| **Settings** | LLM プロバイダ設定、言語セレクタ |
|
|
314
|
-
|
|
315
|
-
---
|
|
316
|
-
|
|
317
|
-
## スマート機能
|
|
318
|
-
|
|
319
|
-
**🧠 スマート検索** — 「login security」で検索すると「OAuth PKCE」についてのメモリが見つかります。MeMesh はホットパスで FTS5 + sqlite-vec を使い、LLM を使いません。ベクトル補完により関連する表現にも届きます。
|
|
320
|
-
|
|
321
|
-
**🌏 分かち書きしない文字体系での検索** — 中国語・日本語・韓国語・タイ語・ラオ語・クメール語・半角カタカナは隣り合う 2 文字の組として索引化されます。そのため「資料庫遷移前一定要先備份」と書いた記憶は、全文を正確に打ち込まなくても「備份」で見つかります。書き込み側と検索側の両方で NFC 正規化を行うので、macOS や韓国語・ベトナム語の IME で入力した記憶もどちらの表記でも見つかります。
|
|
322
|
-
|
|
323
|
-
**📊 スコア付きランキング** — 関連性 (30%) + 新しさ (25%) + 頻度 (18%) + 信頼度 (17%) + リコール影響度 (10%) でランク付け。
|
|
324
|
-
|
|
325
|
-
**🔄 知識の進化** — 判断は変わります。`forget` で古いメモリをアーカイブ (削除されない)。`supersedes` 関係で古い → 新しい をリンク。AI は常に最新版を参照します。
|
|
326
|
-
|
|
327
|
-
**⚠️ 矛盾検出** — 互いに矛盾するメモリが 2 つある場合、MeMesh が警告します。
|
|
328
|
-
|
|
329
|
-
**🕸️ ナレッジグラフ接続性** — `memesh kg backfill-relations --all-rules` はタグの共起・プロジェクトクラスタリング・セッションコンテキスト・名前類似度を使って孤立エンティティをリンク — LLM 不要。
|
|
330
|
-
|
|
331
|
-
**📦 チーム共有** — `memesh export > team-knowledge.json` → チームと共有 → `memesh import team-knowledge.json`。
|
|
332
|
-
インポートされたバンドルは検索可能ですが、MeMesh はレビュー・ローカル再保存まで Claude フックへの自動注入はしません。
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## 使用例
|
|
337
|
-
|
|
338
|
-
> 「MeMesh が 3 週間前に PKCE と implicit フロー間で PKCE を選んだことを覚えていました。再び認証について Claude に聞いた時、すでに知っていました — 説明し直す必要がなかった。」
|
|
339
|
-
> — **SaaS 構築中のソロ開発者**
|
|
340
|
-
|
|
341
|
-
> 「毎週金曜日にチームのメモリをエクスポート、月曜日にインポートします。全員の Claude は先週チームが学んだことを知った状態で週を始めます。」
|
|
342
|
-
> — **3 人スタートアップ、共有知識ベース**
|
|
343
|
-
|
|
344
|
-
> 「ダッシュボードで、メモリの 90% が自動生成セッションログだったことに気づきました。アーキテクチャ判断向けに意図的に `remember` を使い始めました。ゲームチェンジャーです。」
|
|
345
|
-
> — **Analytics タブを発見した開発者**
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
## スマートモードをアンロック (オプション)
|
|
350
|
-
|
|
351
|
-
MeMesh はデフォルトでオフライン動作します — リコールは厳密に LLM フリーのまま(箱出し状態で LongMemEval-S 95.60% R@5)。LLM API キーを追加するのは、その上に LLM 拡張の分析フローを重ねたい場合のみです: より賢いセッション抽出、新規メモリの自動タグ付け、失敗からのレッスン生成、`dream` 圧縮:
|
|
352
|
-
|
|
353
|
-
```bash
|
|
354
|
-
memesh config set llm.provider anthropic
|
|
355
|
-
memesh config set llm.api-key sk-ant-...
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
またはダッシュボード Settings タブで視覚的にセットアップ:
|
|
359
|
-
|
|
360
|
-
```bash
|
|
361
|
-
memesh serve # ダッシュボード → Settings タブを開く
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
**過去のセッションをメモリに掘り起こす。** `memesh dream run --from-transcripts` はこのプロジェクトの Claude Code セッション記録を読み、会話に埋もれた決定や教訓を LLM に尋ね、提案としてステージングします——知識グラフには自動的には入りません。`memesh dream show <id>` で一つずつ確認し、残す価値のあるものを accept してください。
|
|
365
|
-
|
|
366
|
-
### 独自のエンベディングを使う(任意)
|
|
367
|
-
|
|
368
|
-
デフォルトで MeMesh は**キーワードのみ**のリコール(FTS5)を行います — API キー不要、モデルのダウンロード不要、データは端末外に出ません。セマンティック(意味ベース)検索は任意で、エンベダーが必要です。次のいずれかを設定してください:
|
|
369
|
-
|
|
370
|
-
```bash
|
|
371
|
-
memesh config set embedder.provider openai # or: ollama
|
|
372
|
-
memesh config set embedder.model text-embedding-3-small
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
エンベダーは**チャット LLM とは独立して**構成されます — `llm.provider` を変更してもエンベディングが黙って変わることはありません。異なる次元(例: 768 → 1536)に切り替えると、MeMesh は次回の書き込み時にベクトルインデックスを自動的に再構築します。対応する `embedder.provider`: `ollama`(ローカル)、`openai`(ホスト型)。どちらも未設定ならリコールはキーワード検索のままです。
|
|
376
|
-
|
|
377
|
-
| | レベル 0 (デフォルト) | レベル 1 (スマートモード) |
|
|
378
|
-
|---|---|---|
|
|
379
|
-
| **検索** | FTS5 + sqlite-vec、95.60% R@5 | 変更なし — リコールはどのレベルでも LLM フリー |
|
|
380
|
-
| **自動キャプチャ** | ルールベースパターン | + LLM が判断・教訓を抽出 |
|
|
381
|
-
| **自動タグ付け** | 手動タグのみ | + LLM が新規メモリにタグを生成 |
|
|
382
|
-
| **失敗分析** | 利用不可 | + LLM がセッションエラーを構造化教訓に変換 |
|
|
383
|
-
| **圧縮** | 利用不可 | `dream` が冗長メモリを圧縮 |
|
|
384
|
-
| **コスト** | 無料、API キー不要 | 分析呼び出しあたり ~$0.0001(Haiku) |
|
|
385
|
-
|
|
386
|
-
---
|
|
387
|
-
|
|
388
|
-
## 7 つのメモリツール全覧
|
|
389
|
-
|
|
390
|
-
| ツール | 機能 |
|
|
391
|
-
|------|------|
|
|
392
|
-
| `remember` | 観察、関係、タグ付きで知識を保存 |
|
|
393
|
-
| `recall` | FTS5 + sqlite-vec 検索、多要素スコアリング(関連性、新しさ、頻度、信頼度、リコール影響度) — ホットパスに LLM なし |
|
|
394
|
-
| `forget` | ソフトアーカイブ (削除されない) または特定の観察を削除 |
|
|
395
|
-
| `export` | メモリを JSON でシェア (プロジェクト・チーム間) |
|
|
396
|
-
| `import` | マージ戦略付きメモリインポート (スキップ / 上書き / 追記) |
|
|
397
|
-
| `learn` | ミスから構造化教訓を記録 (エラー、根本原因、修正、予防) |
|
|
398
|
-
| `user_patterns` | 作業パターンを分析 — スケジュール、ツール、強み、学習領域 |
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## アーキテクチャ
|
|
403
|
-
|
|
404
|
-
```
|
|
405
|
-
┌─────────────────┐
|
|
406
|
-
│ Core Engine │
|
|
407
|
-
│ (7 operations) │
|
|
408
|
-
└────────┬────────┘
|
|
409
|
-
┌─────────────────┼─────────────────┐
|
|
410
|
-
│ │ │
|
|
411
|
-
CLI (memesh) HTTP API (serve) MCP (memesh-mcp)
|
|
412
|
-
│ │ │
|
|
413
|
-
└─────────────────┼─────────────────┘
|
|
414
|
-
│
|
|
415
|
-
SQLite + FTS5 + sqlite-vec
|
|
416
|
-
(~/.memesh/knowledge-graph.db)
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
コアはフレームワーク非依存。ターミナル、HTTP、MCP から同じロジックで動作します。
|
|
420
|
-
|
|
421
|
-
---
|
|
422
|
-
|
|
423
|
-
## アップグレード
|
|
424
|
-
|
|
425
|
-
Claude Code の plugin marketplace はインストール時にバージョンを固定し、**自動更新しません**。新しいリリースを取得するには:
|
|
426
|
-
|
|
427
|
-
**オプション A — `/plugin` UI**:`memesh@pcircle-memesh` をアンインストールして再インストール。Claude Code が marketplace の最新バージョンを取得します。
|
|
428
|
-
|
|
429
|
-
**オプション B — ワンラインスクリプト**(UI クリック不要、冪等):
|
|
430
|
-
|
|
431
|
-
```bash
|
|
432
|
-
# plugin が v4.2.5 以降なら、スクリプトは同梱済み:
|
|
433
|
-
bash ~/.claude/plugins/cache/pcircle-memesh/memesh/<current-version>/scripts/upgrade-plugin.sh
|
|
434
|
-
|
|
435
|
-
# v4.2.5 より前(つまり v4.2.4 または v4.2.3)のインストールの場合、
|
|
436
|
-
# スクリプトはまだ plugin に入っていません。npm-global の副本を使用:
|
|
437
|
-
bash "$(npm prefix -g)/lib/node_modules/@pcircle/memesh/scripts/upgrade-plugin.sh"
|
|
438
|
-
|
|
439
|
-
# (`npm install -g @pcircle/memesh` も実行済みであることを前提とします。
|
|
440
|
-
# まだなら、ちょうど良い機会です — 上の「インストールパス早見表」セクションで、
|
|
441
|
-
# 多くのユーザーが両方のパスを必要とする理由を確認してください。)
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
スクリプトは marketplace cache を fast-forward し、新バージョンを `~/.claude/plugins/cache/` に展開し、runtime deps をインストールし、`installed_plugins.json` を新バージョンに向け直します。完了後、MCP server が再接続するように Claude Code を再起動してください。
|
|
445
|
-
|
|
446
|
-
**npm-global インストール**(`npm install -g @pcircle/memesh`)は `memesh update` で自動更新できます。Source checkouts:`git pull && npm install && npm run build`。
|
|
447
|
-
|
|
448
|
-
セッション開始時、新しいリリースがあると 1 行のバナーが表示されます(バージョンごとに 24 時間スロットル)。`memesh doctor` はアップグレードターゲットとチャンネル固有のコマンドを報告します。
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## コントリビュート
|
|
453
|
-
|
|
454
|
-
```bash
|
|
455
|
-
git clone https://github.com/PCIRCLE-AI/memesh-llm-memory
|
|
456
|
-
cd memesh-llm-memory && npm install && npm run build
|
|
457
|
-
npm test
|
|
458
|
-
npm run test:e2e-dashboard
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
ダッシュボード: `cd dashboard && npm install && npm run dev`
|
|
462
|
-
|
|
463
|
-
---
|
|
464
|
-
|
|
465
|
-
<p align="center">
|
|
466
|
-
<strong>MIT</strong> — Made by <a href="https://pcircle.com">PCIRCLE AI</a>
|
|
467
|
-
</p>
|