paput-mcp 2.0.3 → 2.2.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 +99 -131
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install-codex-skill.js +58 -0
- package/dist/cli/install-codex-skill.js.map +1 -0
- package/dist/cli/setup-ai.js +260 -0
- package/dist/cli/setup-ai.js.map +1 -0
- package/dist/handlers/add-knowledge-candidates/handler.js +68 -0
- package/dist/handlers/add-knowledge-candidates/handler.js.map +1 -0
- package/dist/handlers/add-knowledge-candidates/index.js +3 -0
- package/dist/handlers/add-knowledge-candidates/index.js.map +1 -0
- package/dist/handlers/add-knowledge-candidates/tool.js +36 -0
- package/dist/handlers/add-knowledge-candidates/tool.js.map +1 -0
- package/dist/handlers/cache-status/handler.js +22 -0
- package/dist/handlers/cache-status/handler.js.map +1 -0
- package/dist/handlers/cache-status/index.js +3 -0
- package/dist/handlers/cache-status/index.js.map +1 -0
- package/dist/handlers/cache-status/tool.js +13 -0
- package/dist/handlers/cache-status/tool.js.map +1 -0
- package/dist/handlers/discard-pending-candidate/handler.js +36 -0
- package/dist/handlers/discard-pending-candidate/handler.js.map +1 -0
- package/dist/handlers/discard-pending-candidate/index.js +3 -0
- package/dist/handlers/discard-pending-candidate/index.js.map +1 -0
- package/dist/handlers/discard-pending-candidate/tool.js +17 -0
- package/dist/handlers/discard-pending-candidate/tool.js.map +1 -0
- package/dist/handlers/get-session-transcript/handler.js +42 -0
- package/dist/handlers/get-session-transcript/handler.js.map +1 -0
- package/dist/handlers/get-session-transcript/index.js +3 -0
- package/dist/handlers/get-session-transcript/index.js.map +1 -0
- package/dist/handlers/get-session-transcript/tool.js +28 -0
- package/dist/handlers/get-session-transcript/tool.js.map +1 -0
- package/dist/handlers/index.js +8 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/list-pending-candidates/handler.js +19 -0
- package/dist/handlers/list-pending-candidates/handler.js.map +1 -0
- package/dist/handlers/list-pending-candidates/index.js +3 -0
- package/dist/handlers/list-pending-candidates/index.js.map +1 -0
- package/dist/handlers/list-pending-candidates/tool.js +18 -0
- package/dist/handlers/list-pending-candidates/tool.js.map +1 -0
- package/dist/handlers/save-pending-candidate/handler.js +80 -0
- package/dist/handlers/save-pending-candidate/handler.js.map +1 -0
- package/dist/handlers/save-pending-candidate/index.js +3 -0
- package/dist/handlers/save-pending-candidate/index.js.map +1 -0
- package/dist/handlers/save-pending-candidate/tool.js +20 -0
- package/dist/handlers/save-pending-candidate/tool.js.map +1 -0
- package/dist/handlers/scan-sessions/handler.js +26 -0
- package/dist/handlers/scan-sessions/handler.js.map +1 -0
- package/dist/handlers/scan-sessions/index.js +3 -0
- package/dist/handlers/scan-sessions/index.js.map +1 -0
- package/dist/handlers/scan-sessions/tool.js +27 -0
- package/dist/handlers/scan-sessions/tool.js.map +1 -0
- package/dist/handlers/sync-remote-memos/handler.js +42 -0
- package/dist/handlers/sync-remote-memos/handler.js.map +1 -0
- package/dist/handlers/sync-remote-memos/index.js +3 -0
- package/dist/handlers/sync-remote-memos/index.js.map +1 -0
- package/dist/handlers/sync-remote-memos/tool.js +22 -0
- package/dist/handlers/sync-remote-memos/tool.js.map +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/services/local-cache/index.js +235 -0
- package/dist/services/local-cache/index.js.map +1 -0
- package/dist/services/session/index.js +124 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/tool.js +9 -1
- package/dist/tool.js.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/knowledge.js +2 -0
- package/dist/types/knowledge.js.map +1 -0
- package/package.json +2 -5
package/README.md
CHANGED
|
@@ -1,50 +1,42 @@
|
|
|
1
1
|
# PaPut MCP サーバー
|
|
2
2
|
|
|
3
3
|
[PaPut](https://paput.io) と連携する Model Context Protocol (MCP) サーバーです。
|
|
4
|
-
|
|
4
|
+
Claude、Codex、Cursor などの AI アシスタントから PaPut のメモ、ノート、アイデア、スキルシートを操作できます。
|
|
5
5
|
|
|
6
6
|
## 機能
|
|
7
7
|
|
|
8
|
-
###
|
|
9
|
-
|
|
10
|
-
- メモの作成、検索、取得、更新、削除
|
|
11
|
-
- カテゴリの設定と管理
|
|
12
|
-
- 公開/非公開設定
|
|
13
|
-
|
|
14
|
-
### ノート管理
|
|
15
|
-
|
|
16
|
-
- ノートの作成、検索、取得、更新、削除
|
|
17
|
-
- メモとの関連付け
|
|
18
|
-
|
|
19
|
-
### アイデア管理
|
|
8
|
+
### PaPut データ管理
|
|
20
9
|
|
|
10
|
+
- メモの作成、検索、取得、更新
|
|
11
|
+
- ノートの作成、検索、取得、更新
|
|
21
12
|
- アイデアの作成、一覧表示、更新、削除
|
|
13
|
+
- スキルシートの取得、基本情報更新、自己PR更新
|
|
14
|
+
- スキルシートのスキル/プロジェクト管理
|
|
22
15
|
|
|
23
|
-
###
|
|
16
|
+
### AI セッションの知見保存
|
|
24
17
|
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
18
|
+
- Claude/Codex のセッションログを検出
|
|
19
|
+
- AI が抽出した知見候補を pending に一時保存
|
|
20
|
+
- 既存 PaPut メモをローカルキャッシュへ同期
|
|
21
|
+
- fingerprint による重複登録の抑制
|
|
22
|
+
- pending 候補を確認してから PaPut に本保存
|
|
23
|
+
- Claude/Codex 向け Skill とグローバルルールのセットアップ
|
|
30
24
|
|
|
31
25
|
## インストール
|
|
32
26
|
|
|
33
|
-
|
|
27
|
+
npx で直接実行できます。
|
|
34
28
|
|
|
35
29
|
```bash
|
|
36
|
-
|
|
30
|
+
npx -y paput-mcp
|
|
37
31
|
```
|
|
38
32
|
|
|
39
|
-
|
|
33
|
+
グローバルにインストールする場合:
|
|
40
34
|
|
|
41
35
|
```bash
|
|
42
|
-
|
|
36
|
+
npm install -g paput-mcp
|
|
43
37
|
```
|
|
44
38
|
|
|
45
|
-
##
|
|
46
|
-
|
|
47
|
-
### 各 AI アシスタントの設定
|
|
39
|
+
## MCP 設定
|
|
48
40
|
|
|
49
41
|
API キーは PaPut の設定画面から取得できます。
|
|
50
42
|
|
|
@@ -59,27 +51,83 @@ API キーは PaPut の設定画面から取得できます。
|
|
|
59
51
|
}
|
|
60
52
|
```
|
|
61
53
|
|
|
62
|
-
###
|
|
54
|
+
### 環境変数
|
|
63
55
|
|
|
64
|
-
`
|
|
56
|
+
- `PAPUT_API_KEY` - 必須。PaPut API キー
|
|
57
|
+
- `PAPUT_API_URL` - 任意。API URL。未指定時は `https://api.paput.io`
|
|
58
|
+
- `PAPUT_PROJECT_MATCH` - 任意。メモ作成/更新時に紐付けるプロジェクト名の一部
|
|
59
|
+
- `PAPUT_CACHE_DIR` - 任意。知見保存用ローカルキャッシュの保存先。未指定時は `~/.paput-mcp`
|
|
60
|
+
- `PAPUT_HOME` - 任意。PaPut Skill 正本の保存先。未指定時は `~/.paput`
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
62
|
+
`PAPUT_PROJECT_MATCH` を設定すると、メモ作成・更新時に、指定文字列を含むスキルシートプロジェクトが自動で紐付けられます。複数マッチした場合は最初のプロジェクトが使われます。
|
|
63
|
+
|
|
64
|
+
## AI 連携の初期設定
|
|
65
|
+
|
|
66
|
+
Claude/Codex で PaPut Skill とグローバルルールを使う場合は、次を実行します。
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx -y paput-mcp setup-ai
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
このコマンドは、実行時に変更内容を表示したうえで以下を行います。
|
|
73
|
+
|
|
74
|
+
- `~/.paput/skills` に PaPut Skill の正本を作成
|
|
75
|
+
- Claude が存在する場合、`~/.claude/skills` に symlink を作成
|
|
76
|
+
- Codex が存在する場合、`~/.agents/skills` に symlink を作成
|
|
77
|
+
- Claude/Codex のグローバルルールに PaPut 利用ルールを追記
|
|
78
|
+
|
|
79
|
+
オプション:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# グローバルルールを変更しない
|
|
83
|
+
npx -y paput-mcp setup-ai --no-rules
|
|
84
|
+
|
|
85
|
+
# PaPut 管理のリンクやルールを更新
|
|
86
|
+
npx -y paput-mcp setup-ai --force
|
|
87
|
+
|
|
88
|
+
# Claude または Codex だけ設定
|
|
89
|
+
npx -y paput-mcp setup-ai --claude-only
|
|
90
|
+
npx -y paput-mcp setup-ai --codex-only
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
生成される Skill:
|
|
94
|
+
|
|
95
|
+
- `paput-init` - 初回設定、既存メモ同期、未処理セッション確認
|
|
96
|
+
- `paput-sync` - 既存 PaPut メモをローカルキャッシュへ同期
|
|
97
|
+
- `paput-capture` - 現在の会話や指定テーマから知見候補を pending に保存
|
|
98
|
+
- `paput-save` - pending 候補を確認し、承認したものだけ PaPut に保存
|
|
99
|
+
|
|
100
|
+
## 知見保存ワークフロー
|
|
101
|
+
|
|
102
|
+
PaPut への保存は、意図しないメモ登録を避けるために 2 段階で行います。
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
知見候補を抽出
|
|
106
|
+
↓
|
|
107
|
+
pending に保存
|
|
108
|
+
↓
|
|
109
|
+
確認後に PaPut へ本保存
|
|
71
110
|
```
|
|
72
111
|
|
|
73
|
-
-
|
|
74
|
-
- 複数マッチした場合は最初のプロジェクトが選択されます
|
|
112
|
+
通常は、`setup-ai` が追記するグローバルルールにより、AI が作業完了時や問題解決時に PaPut へ残す候補を自発的に提示します。
|
|
75
113
|
|
|
76
|
-
|
|
114
|
+
AI が候補提示を行わなかった場合は、`paput-capture` を使います。
|
|
77
115
|
|
|
78
|
-
|
|
116
|
+
```text
|
|
117
|
+
PaPut に残す知見候補を作って
|
|
118
|
+
```
|
|
79
119
|
|
|
80
|
-
|
|
120
|
+
pending 候補を PaPut に本保存する場合は、`paput-save` を使います。
|
|
81
121
|
|
|
82
|
-
|
|
122
|
+
```text
|
|
123
|
+
PaPut の保存候補を確認して
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Claude では `/paput-save` のように Skill を呼び出せます。Codex では `$paput-save` または自然言語で利用します。
|
|
127
|
+
|
|
128
|
+
## 利用可能なツール
|
|
129
|
+
|
|
130
|
+
### メモ管理
|
|
83
131
|
|
|
84
132
|
- `paput_create_memo` - メモを作成
|
|
85
133
|
- `paput_search_memo` - メモを検索
|
|
@@ -87,21 +135,21 @@ API キーは PaPut の設定画面から取得できます。
|
|
|
87
135
|
- `paput_update_memo` - メモを更新
|
|
88
136
|
- `paput_get_categories` - カテゴリー一覧を取得
|
|
89
137
|
|
|
90
|
-
|
|
138
|
+
### ノート管理
|
|
91
139
|
|
|
92
140
|
- `paput_create_note` - ノートを作成
|
|
93
141
|
- `paput_search_notes` - ノートを検索
|
|
94
142
|
- `paput_get_note` - ノートの詳細を取得
|
|
95
143
|
- `paput_update_note` - ノートを更新
|
|
96
144
|
|
|
97
|
-
|
|
145
|
+
### アイデア管理
|
|
98
146
|
|
|
99
147
|
- `paput_list_ideas` - アイデア一覧を取得
|
|
100
148
|
- `paput_create_idea` - アイデアを作成
|
|
101
149
|
- `paput_update_idea` - アイデアを更新
|
|
102
150
|
- `paput_delete_idea` - アイデアを削除
|
|
103
151
|
|
|
104
|
-
|
|
152
|
+
### スキルシート管理
|
|
105
153
|
|
|
106
154
|
- `paput_get_skill_sheet` - スキルシートを取得
|
|
107
155
|
- `paput_update_skill_sheet_basic_info` - スキルシート基本情報を更新
|
|
@@ -116,93 +164,13 @@ API キーは PaPut の設定画面から取得できます。
|
|
|
116
164
|
- `paput_update_skill_sheet_project` - スキルシートのプロジェクトを更新
|
|
117
165
|
- `paput_delete_skill_sheet_project` - スキルシートからプロジェクトを削除
|
|
118
166
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
### AI アシスタントのルール設定
|
|
122
|
-
|
|
123
|
-
AI アシスタントの設定(.windsurfrules など)に以下を追加してください。(あくまで例です。ご自身の要件に応じて調整してください。)
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
## メモ作成依頼について(paput-mcp)
|
|
127
|
-
メモ作成を依頼した場合、以下を準拠する
|
|
128
|
-
- 一つのメモが大きくなりすぎないように、最小の粒度でメモを作成する
|
|
129
|
-
- タイトル、内容、カテゴリー(複数可)を提示する
|
|
130
|
-
- 文章は、です/ます 調にしない
|
|
131
|
-
- カテゴリーは、言語、フレームワーク、ツールくらいの粒度で設定する(例: バックエンド のような大きな括りは設定しない)
|
|
132
|
-
- プロジェクト固有のコードを含めない
|
|
133
|
-
- 勝手に MCP を経由してメモを作成せず、明示的に指示するまではチャット上にメモを提示すること
|
|
134
|
-
- 基本的に非公開に設定し、明示的に指示した場合のみ公開にする
|
|
135
|
-
- 内容には、マークダウンの # で始まる行を含めない(タイトルに相当するため)
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### プロンプト例
|
|
139
|
-
|
|
140
|
-
1. 登録すべきメモを提示してもらう(推奨)
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
ここまでの開発をメモにして提示してください。
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
2. メモ確認し問題がなかったら、登録する
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
提案された内容で、PaPut にメモを作成してください。
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
いきなり 2 の方法を実施すると、意図しないメモが登録されてしまう可能性があるため、1 の方法を挟んでからメモを登録することを推奨します。
|
|
153
|
-
また、各 AI アシスタントのルール設定で、自分好みのメモを作成してもらえるように、ある程度コントロールすることが可能です。
|
|
154
|
-
|
|
155
|
-
## Claude Code の Custom Slash Command の使用例
|
|
156
|
-
|
|
157
|
-
以下の設定を `~/.claude/commands/paput.md` ファイルとして保存すると、Claude Code で `/paput` コマンドが使用できます:
|
|
158
|
-
|
|
159
|
-
````markdown
|
|
160
|
-
---
|
|
161
|
-
allowed-tools: mcp__paput__paput_create_memo, mcp__paput__paput_search_memo, mcp__paput__paput_get_categories
|
|
162
|
-
description: 問題解決時の知見やベストプラクティスをPaPutにメモとして保存
|
|
163
|
-
argument-hint: (任意) 保存したい知見の概要
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## PaPut メモ作成コマンド
|
|
167
|
-
|
|
168
|
-
このコマンドは、コーディング中に得られた知見を PaPut にメモとして保存します。
|
|
169
|
-
|
|
170
|
-
### 使用方法
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# 会話全体から知見を自動抽出
|
|
174
|
-
/paput
|
|
175
|
-
|
|
176
|
-
# 特定の知見についてメモ化(例)
|
|
177
|
-
/paput Bunでのマイグレーション手順
|
|
178
|
-
/paput JWT認証のエラーハンドリング方法
|
|
179
|
-
/paput クリーンアーキテクチャでのリポジトリ実装パターン
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### メモ作成のタイミング
|
|
183
|
-
|
|
184
|
-
以下のような場面で、自動的にメモの下書きを提示します:
|
|
185
|
-
|
|
186
|
-
1. **問題解決時の知見** - バグ修正や問題解決で得られた知識
|
|
187
|
-
2. **設計・アーキテクチャ決定** - システム設計の重要な決定事項
|
|
188
|
-
3. **ベストプラクティスの発見** - より良い実装方法の発見
|
|
189
|
-
4. **デバッグ手法の確立** - 効果的なデバッグ方法の発見
|
|
190
|
-
5. **タスク完了時に得られた知見** - タスク完了後の学び
|
|
191
|
-
|
|
192
|
-
### 処理フロー
|
|
193
|
-
|
|
194
|
-
1. 現在の会話内容から、保存すべき知見を分析
|
|
195
|
-
2. メモの下書きを提示(タイトル、内容、カテゴリー)
|
|
196
|
-
3. ユーザーの確認・修正を待つ
|
|
197
|
-
4. 承認されたら PaPut に登録
|
|
198
|
-
|
|
199
|
-
### メモ作成ルール
|
|
167
|
+
### 知見保存・ローカルキャッシュ
|
|
200
168
|
|
|
201
|
-
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
205
|
-
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
|
|
169
|
+
- `paput_cache_status` - ローカルキャッシュ状態を取得
|
|
170
|
+
- `paput_sync_remote_memos` - 既存 PaPut メモをローカルキャッシュへ同期
|
|
171
|
+
- `paput_scan_sessions` - Claude/Codex のローカルセッションログを検出
|
|
172
|
+
- `paput_get_session_transcript` - セッション本文を取得
|
|
173
|
+
- `paput_add_knowledge_candidates` - AI が抽出した知見候補を pending に保存
|
|
174
|
+
- `paput_list_pending_candidates` - 未保存の知見候補を一覧表示
|
|
175
|
+
- `paput_save_pending_candidate` - pending 候補を PaPut メモとして保存
|
|
176
|
+
- `paput_discard_pending_candidate` - pending 候補を破棄
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { setupAi } from './setup-ai.js';
|
|
2
|
+
export function runCli(args) {
|
|
3
|
+
const command = args[0];
|
|
4
|
+
if (!command)
|
|
5
|
+
return false;
|
|
6
|
+
if (command === 'setup-ai') {
|
|
7
|
+
setupAi(args.slice(1));
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
if (command === '--help' || command === '-h' || command === 'help') {
|
|
11
|
+
printHelp();
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
console.error(`Unknown command: ${command}`);
|
|
15
|
+
printHelp();
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function printHelp() {
|
|
20
|
+
console.log(`Usage:
|
|
21
|
+
paput-mcp MCP サーバーを起動
|
|
22
|
+
paput-mcp setup-ai Claude/Codex 向け PaPut 連携を初期設定
|
|
23
|
+
|
|
24
|
+
Options:
|
|
25
|
+
--force PaPut 管理の既存リンク/ルールを更新
|
|
26
|
+
--no-rules グローバルルールを追記しない
|
|
27
|
+
--claude-only Claude のみ設定
|
|
28
|
+
--codex-only Codex のみ設定
|
|
29
|
+
`);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,SAAS,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC7C,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;CASb,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const SKILL_CONTENT = `---
|
|
5
|
+
name: paput
|
|
6
|
+
description: Use this skill when the user wants to save, review, sync, or extract reusable knowledge with PaPut from Codex sessions, pending candidates, or the local PaPut MCP cache.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# PaPut Knowledge Workflow
|
|
10
|
+
|
|
11
|
+
Use PaPut MCP tools when the user asks to save knowledge, review pending candidates, sync PaPut, or digest Codex/Claude sessions.
|
|
12
|
+
|
|
13
|
+
## Session Digest
|
|
14
|
+
|
|
15
|
+
1. Call \`paput_scan_sessions\` to find unprocessed sessions.
|
|
16
|
+
2. Call \`paput_get_session_transcript\` for relevant sessions.
|
|
17
|
+
3. Extract concise, reusable knowledge candidates.
|
|
18
|
+
4. Save candidates with \`paput_add_knowledge_candidates\`.
|
|
19
|
+
5. Do not publish directly unless the user explicitly asks.
|
|
20
|
+
|
|
21
|
+
## Review
|
|
22
|
+
|
|
23
|
+
1. Call \`paput_list_pending_candidates\`.
|
|
24
|
+
2. Show concise candidates with titles, categories, and similar memo hints.
|
|
25
|
+
3. Save approved items with \`paput_save_pending_candidate\`.
|
|
26
|
+
4. Discard rejected items with \`paput_discard_pending_candidate\`.
|
|
27
|
+
|
|
28
|
+
## Sync
|
|
29
|
+
|
|
30
|
+
Call \`paput_sync_remote_memos\` before duplicate-sensitive work or when the user updated PaPut outside Codex.
|
|
31
|
+
|
|
32
|
+
## Defaults
|
|
33
|
+
|
|
34
|
+
- Keep new candidates private unless the user says otherwise.
|
|
35
|
+
- Prefer pending review over direct save.
|
|
36
|
+
- Avoid saving project-specific secrets, credentials, or private customer data.
|
|
37
|
+
- If no PaPut cache exists, call \`paput_cache_status\` and then \`paput_sync_remote_memos\`.
|
|
38
|
+
`;
|
|
39
|
+
export function installCodexSkill(args) {
|
|
40
|
+
const force = args.includes('--force');
|
|
41
|
+
const codexHome = process.env.CODEX_HOME || join(homedir(), '.codex');
|
|
42
|
+
const skillDir = join(codexHome, 'skills', 'paput');
|
|
43
|
+
const skillPath = join(skillDir, 'SKILL.md');
|
|
44
|
+
if (existsSync(skillPath) && !force) {
|
|
45
|
+
console.error(`Codex Skill already exists: ${skillPath}\nUse --force to overwrite it.`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
mkdirSync(skillDir, { recursive: true });
|
|
50
|
+
writeFileSync(skillPath, SKILL_CONTENT, 'utf8');
|
|
51
|
+
console.log(`Installed PaPut Codex Skill: ${skillPath}`);
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log('Try asking Codex:');
|
|
54
|
+
console.log('- PaPut の pending 候補を確認して');
|
|
55
|
+
console.log('- このセッションから知見候補を抽出して PaPut の pending に入れて');
|
|
56
|
+
console.log('- PaPut の既存メモを同期して');
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=install-codex-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-codex-skill.js","sourceRoot":"","sources":["../../src/cli/install-codex-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCrB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE7C,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CACX,+BAA+B,SAAS,gCAAgC,CACzE,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CACT,2CAA2C,CAC5C,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const SKILLS = [
|
|
5
|
+
{
|
|
6
|
+
name: 'paput-init',
|
|
7
|
+
description: 'PaPut の初期設定、既存メモ同期、未処理セッション確認を行いたい時に使う。',
|
|
8
|
+
body: `# PaPut 初期設定
|
|
9
|
+
|
|
10
|
+
PaPut の知見保存運用を始めるための初期設定を行う。
|
|
11
|
+
|
|
12
|
+
## 手順
|
|
13
|
+
|
|
14
|
+
1. \`paput_cache_status\` でローカルキャッシュ状態を確認する。
|
|
15
|
+
2. \`paput_sync_remote_memos\` で既存 PaPut メモをローカルキャッシュへ同期する。
|
|
16
|
+
3. \`paput_scan_sessions\` で Claude/Codex の未処理セッションを確認する。
|
|
17
|
+
4. 未処理セッションがある場合は、件数と概要をユーザーに提示する。
|
|
18
|
+
5. ユーザーが希望した場合のみ、\`paput_get_session_transcript\` で本文を取得し、知見候補を抽出して \`paput_add_knowledge_candidates\` で pending に保存する。
|
|
19
|
+
|
|
20
|
+
## 注意
|
|
21
|
+
|
|
22
|
+
- PaPut への本保存は行わない。
|
|
23
|
+
- 候補はまず pending に保存する。
|
|
24
|
+
- 重複や類似メモがある場合は、その情報を提示する。`,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'paput-sync',
|
|
28
|
+
description: 'PaPut の既存メモをローカルキャッシュへ同期し、重複判定の精度を上げたい時に使う。',
|
|
29
|
+
body: `# PaPut 同期
|
|
30
|
+
|
|
31
|
+
PaPut の既存メモをローカルキャッシュへ同期する。
|
|
32
|
+
|
|
33
|
+
## 手順
|
|
34
|
+
|
|
35
|
+
1. \`paput_cache_status\` で同期前の状態を確認する。
|
|
36
|
+
2. \`paput_sync_remote_memos\` を実行する。
|
|
37
|
+
3. 再度 \`paput_cache_status\` を実行し、同期後の件数を確認する。
|
|
38
|
+
4. 同期結果を簡潔にユーザーへ報告する。
|
|
39
|
+
|
|
40
|
+
## 注意
|
|
41
|
+
|
|
42
|
+
- 同期は重複判定のために行う。
|
|
43
|
+
- pending 候補の保存や破棄は行わない。
|
|
44
|
+
- PaPut への新規メモ作成は行わない。`,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'paput-save',
|
|
48
|
+
description: 'PaPut の pending 候補を確認し、ユーザーが承認したものだけ PaPut に保存したい時に使う。',
|
|
49
|
+
body: `# PaPut 保存
|
|
50
|
+
|
|
51
|
+
pending に保存された知見候補を確認し、ユーザーが承認したものだけ PaPut に保存する。
|
|
52
|
+
|
|
53
|
+
## 手順
|
|
54
|
+
|
|
55
|
+
1. \`paput_list_pending_candidates\` で pending 候補を取得する。
|
|
56
|
+
2. 候補ごとにタイトル、カテゴリ、要約、類似メモ情報を簡潔に提示する。
|
|
57
|
+
3. ユーザーが保存を承認した候補だけ \`paput_save_pending_candidate\` で PaPut に保存する。
|
|
58
|
+
4. ユーザーが不要と判断した候補は \`paput_discard_pending_candidate\` で破棄する。
|
|
59
|
+
5. 保存・破棄した件数を報告する。
|
|
60
|
+
|
|
61
|
+
## 注意
|
|
62
|
+
|
|
63
|
+
- ユーザー承認なしに PaPut へ保存しない。
|
|
64
|
+
- 「全部保存して」と明示された場合のみ複数候補をまとめて保存する。
|
|
65
|
+
- 候補のタイトルや本文の修正を求められた場合は、保存時に上書きする。
|
|
66
|
+
- 迷う候補や重複が疑われる候補は、保存しない選択肢も提示する。`,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'paput-capture',
|
|
70
|
+
description: '作業中の会話や指定テーマから PaPut に残す知見候補を抽出し、pending に保存したい時に使う。',
|
|
71
|
+
body: `# PaPut 知見候補作成
|
|
72
|
+
|
|
73
|
+
現在の会話やユーザーが指定したテーマから、PaPut に残すべき知見候補を抽出して pending に保存する。グローバルルールで自動提案されなかった時の手動バックアップとして使う。
|
|
74
|
+
|
|
75
|
+
## 使う場面
|
|
76
|
+
|
|
77
|
+
- 問題解決で得た知見を残したい時
|
|
78
|
+
- 設計判断やその理由を残したい時
|
|
79
|
+
- ベストプラクティスやデバッグ手法を残したい時
|
|
80
|
+
- ユーザーが特定テーマのメモ化を依頼した時
|
|
81
|
+
|
|
82
|
+
## 手順
|
|
83
|
+
|
|
84
|
+
1. \`paput_list_pending_candidates\` で既存 pending 候補を確認する。
|
|
85
|
+
2. 現在の会話、またはユーザーが指定したテーマに関連する会話内容から、再利用可能な知見だけを抽出する。
|
|
86
|
+
3. 候補は小さい単位に分け、タイトル、本文、カテゴリ、公開設定を提示する。
|
|
87
|
+
4. 既存 pending と重複しそうな候補は追加せず、既存候補の利用を提案する。
|
|
88
|
+
5. ユーザーが承認した候補だけ \`paput_add_knowledge_candidates\` で pending に保存する。
|
|
89
|
+
|
|
90
|
+
## メモ作成ルール
|
|
91
|
+
|
|
92
|
+
- 一つの候補が大きくなりすぎないよう、最小の粒度で作成する。
|
|
93
|
+
- タイトルは簡潔で検索しやすくする。
|
|
94
|
+
- 本文は具体的な手順、原因、理由、判断基準を含める。
|
|
95
|
+
- 文章は「です/ます」調にしない。
|
|
96
|
+
- カテゴリは言語、フレームワーク、ツール程度の粒度にする。
|
|
97
|
+
- プロジェクト固有のコード、秘密情報、顧客情報は含めない。
|
|
98
|
+
- 基本的に非公開として扱う。
|
|
99
|
+
- 本文に Markdown の \`#\` で始まる見出し行を含めない。
|
|
100
|
+
|
|
101
|
+
## 注意
|
|
102
|
+
|
|
103
|
+
- PaPut へ直接保存しない。
|
|
104
|
+
- 保存先は pending のみ。PaPut への本保存は \`paput-save\` で行う。
|
|
105
|
+
- 候補がない場合は、無理に作らず「保存すべき知見は見つからない」と伝える。`,
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
const RULES = `## PaPut 知見保存ルール
|
|
109
|
+
|
|
110
|
+
作業完了時、問題解決時、設計判断が固まった時、または再利用可能な知見が発生した時は、PaPut に保存すべき候補がないか自動で確認する。
|
|
111
|
+
|
|
112
|
+
候補がある場合は、ユーザーにコマンド実行を求めず、タイトル・本文・カテゴリを提示する。ユーザーが承認したら \`paput_add_knowledge_candidates\` で pending に保存する。
|
|
113
|
+
|
|
114
|
+
PaPut への本保存は、ユーザーが明示的に保存を承認した場合のみ \`paput_save_pending_candidate\` を使う。
|
|
115
|
+
|
|
116
|
+
保存前にはローカルキャッシュや類似メモ情報を使って重複の可能性を確認する。重複が疑われる場合は、保存しない判断も提示する。
|
|
117
|
+
|
|
118
|
+
pending 候補の確認や PaPut への保存をユーザーが求めた場合は、\`paput-save\` の手順に従う。`;
|
|
119
|
+
const RULE_START = '<!-- paput-mcp:start -->';
|
|
120
|
+
const RULE_END = '<!-- paput-mcp:end -->';
|
|
121
|
+
export function setupAi(args) {
|
|
122
|
+
const options = parseOptions(args);
|
|
123
|
+
const paputHome = process.env.PAPUT_HOME || join(homedir(), '.paput');
|
|
124
|
+
const sourceSkillsDir = join(paputHome, 'skills');
|
|
125
|
+
printSetupNotice(options);
|
|
126
|
+
createSourceSkills(sourceSkillsDir, options.force);
|
|
127
|
+
if (options.claude) {
|
|
128
|
+
setupClaude(sourceSkillsDir, options);
|
|
129
|
+
}
|
|
130
|
+
if (options.codex) {
|
|
131
|
+
setupCodex(sourceSkillsDir, options);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function parseOptions(args) {
|
|
135
|
+
const claudeOnly = args.includes('--claude-only');
|
|
136
|
+
const codexOnly = args.includes('--codex-only');
|
|
137
|
+
if (claudeOnly && codexOnly) {
|
|
138
|
+
console.error('--claude-only と --codex-only は同時に指定できません。');
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
return {
|
|
141
|
+
force: false,
|
|
142
|
+
noRules: false,
|
|
143
|
+
claude: false,
|
|
144
|
+
codex: false,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
force: args.includes('--force'),
|
|
149
|
+
noRules: args.includes('--no-rules'),
|
|
150
|
+
claude: !codexOnly,
|
|
151
|
+
codex: !claudeOnly,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function printSetupNotice(options) {
|
|
155
|
+
console.log('PaPut AI 連携の初期設定を行います。');
|
|
156
|
+
console.log('');
|
|
157
|
+
console.log('このコマンドは以下を実行します。');
|
|
158
|
+
console.log('- ~/.paput/skills に PaPut Skill の正本を作成');
|
|
159
|
+
if (options.claude) {
|
|
160
|
+
console.log('- Claude が存在する場合、~/.claude/skills にリンクを作成');
|
|
161
|
+
}
|
|
162
|
+
if (options.codex) {
|
|
163
|
+
console.log('- Codex が存在する場合、~/.agents/skills にリンクを作成');
|
|
164
|
+
}
|
|
165
|
+
if (!options.noRules) {
|
|
166
|
+
console.log('- Claude/Codex のグローバルルールに PaPut 利用ルールを追記');
|
|
167
|
+
}
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log('グローバルルールを変更したくない場合は --no-rules を指定してください。');
|
|
170
|
+
console.log('既存の PaPut 管理ブロックやリンクを更新する場合は --force を指定してください。');
|
|
171
|
+
console.log('');
|
|
172
|
+
}
|
|
173
|
+
function createSourceSkills(sourceSkillsDir, force) {
|
|
174
|
+
mkdirSync(sourceSkillsDir, { recursive: true });
|
|
175
|
+
for (const skill of SKILLS) {
|
|
176
|
+
const skillDir = join(sourceSkillsDir, skill.name);
|
|
177
|
+
const skillPath = join(skillDir, 'SKILL.md');
|
|
178
|
+
if (existsSync(skillPath) && !force) {
|
|
179
|
+
console.log(`Skip source skill: ${skillPath} は既に存在します。`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
mkdirSync(skillDir, { recursive: true });
|
|
183
|
+
writeFileSync(skillPath, renderSkill(skill), 'utf8');
|
|
184
|
+
console.log(`Create source skill: ${skillPath}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function setupClaude(sourceSkillsDir, options) {
|
|
188
|
+
const claudeHome = process.env.CLAUDE_HOME || join(homedir(), '.claude');
|
|
189
|
+
if (!existsSync(claudeHome)) {
|
|
190
|
+
console.log('Skip Claude: ~/.claude が見つかりません。');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
linkSkills(sourceSkillsDir, join(claudeHome, 'skills'), 'Claude', options.force);
|
|
194
|
+
if (!options.noRules) {
|
|
195
|
+
upsertRules(join(claudeHome, 'CLAUDE.md'), options.force, 'Claude');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function setupCodex(sourceSkillsDir, options) {
|
|
199
|
+
const codexHome = process.env.CODEX_HOME || join(homedir(), '.codex');
|
|
200
|
+
const agentsHome = process.env.AGENTS_HOME || join(homedir(), '.agents');
|
|
201
|
+
if (!existsSync(codexHome) && !existsSync(agentsHome)) {
|
|
202
|
+
console.log('Skip Codex: ~/.codex と ~/.agents が見つかりません。');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
linkSkills(sourceSkillsDir, join(agentsHome, 'skills'), 'Codex', options.force);
|
|
206
|
+
if (!options.noRules) {
|
|
207
|
+
upsertRules(join(codexHome, 'AGENTS.md'), options.force, 'Codex');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function linkSkills(sourceSkillsDir, targetSkillsDir, label, force) {
|
|
211
|
+
mkdirSync(targetSkillsDir, { recursive: true });
|
|
212
|
+
for (const skill of SKILLS) {
|
|
213
|
+
const sourceDir = join(sourceSkillsDir, skill.name);
|
|
214
|
+
const targetDir = join(targetSkillsDir, skill.name);
|
|
215
|
+
if (existsSync(targetDir)) {
|
|
216
|
+
const stat = lstatSync(targetDir);
|
|
217
|
+
if (!force) {
|
|
218
|
+
console.log(`Skip ${label} skill link: ${targetDir} は既に存在します。`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
rmSync(targetDir, {
|
|
222
|
+
recursive: stat.isDirectory() && !stat.isSymbolicLink(),
|
|
223
|
+
force: true,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
symlinkSync(sourceDir, targetDir, 'dir');
|
|
227
|
+
console.log(`Link ${label} skill: ${targetDir} -> ${sourceDir}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function upsertRules(path, force, label) {
|
|
231
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
232
|
+
const block = `${RULE_START}\n${RULES}\n${RULE_END}`;
|
|
233
|
+
const current = existsSync(path) ? readFileSync(path, 'utf8') : '';
|
|
234
|
+
const pattern = new RegExp(`${escapeRegExp(RULE_START)}[\\s\\S]*?${escapeRegExp(RULE_END)}`);
|
|
235
|
+
if (pattern.test(current)) {
|
|
236
|
+
if (!force) {
|
|
237
|
+
console.log(`Skip ${label} rules: ${path} には PaPut 管理ブロックが既に存在します。`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
writeFileSync(path, current.replace(pattern, block), 'utf8');
|
|
241
|
+
console.log(`Update ${label} rules: ${path}`);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const next = `${current.trimEnd()}${current ? '\n\n' : ''}${block}\n`;
|
|
245
|
+
writeFileSync(path, next, 'utf8');
|
|
246
|
+
console.log(`Append ${label} rules: ${path}`);
|
|
247
|
+
}
|
|
248
|
+
function renderSkill(skill) {
|
|
249
|
+
return `---
|
|
250
|
+
name: ${skill.name}
|
|
251
|
+
description: ${skill.description}
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
${skill.body}
|
|
255
|
+
`;
|
|
256
|
+
}
|
|
257
|
+
function escapeRegExp(value) {
|
|
258
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=setup-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ai.js","sourceRoot":"","sources":["../../src/cli/setup-ai.ts"],"names":[],"mappings":"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"}
|