watashi-db 0.0.5

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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +239 -0
  3. package/cowork-plugin/.claude-plugin/plugin.json +12 -0
  4. package/cowork-plugin/.mcp.json +8 -0
  5. package/cowork-plugin/agents/memory-keeper.md +48 -0
  6. package/cowork-plugin/skills/reflect/SKILL.md +58 -0
  7. package/cowork-plugin/skills/remember/SKILL.md +54 -0
  8. package/cowork-plugin/skills/session-start/SKILL.md +38 -0
  9. package/dist/constants.d.ts +9 -0
  10. package/dist/constants.js +43 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/database/connection.d.ts +16 -0
  13. package/dist/database/connection.js +42 -0
  14. package/dist/database/connection.js.map +1 -0
  15. package/dist/database/queries.d.ts +227 -0
  16. package/dist/database/queries.js +730 -0
  17. package/dist/database/queries.js.map +1 -0
  18. package/dist/database/schema.d.ts +6 -0
  19. package/dist/database/schema.js +335 -0
  20. package/dist/database/schema.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +57 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/prompts/bootstrap-prompts.d.ts +6 -0
  25. package/dist/prompts/bootstrap-prompts.js +69 -0
  26. package/dist/prompts/bootstrap-prompts.js.map +1 -0
  27. package/dist/provenance.d.ts +29 -0
  28. package/dist/provenance.js +33 -0
  29. package/dist/provenance.js.map +1 -0
  30. package/dist/resources/context-resources.d.ts +6 -0
  31. package/dist/resources/context-resources.js +102 -0
  32. package/dist/resources/context-resources.js.map +1 -0
  33. package/dist/tools/claim-tools.d.ts +6 -0
  34. package/dist/tools/claim-tools.js +176 -0
  35. package/dist/tools/claim-tools.js.map +1 -0
  36. package/dist/tools/decision-tools.d.ts +6 -0
  37. package/dist/tools/decision-tools.js +117 -0
  38. package/dist/tools/decision-tools.js.map +1 -0
  39. package/dist/tools/episode-tools.d.ts +7 -0
  40. package/dist/tools/episode-tools.js +128 -0
  41. package/dist/tools/episode-tools.js.map +1 -0
  42. package/dist/tools/export-tools.d.ts +6 -0
  43. package/dist/tools/export-tools.js +104 -0
  44. package/dist/tools/export-tools.js.map +1 -0
  45. package/dist/tools/profile-tools.d.ts +6 -0
  46. package/dist/tools/profile-tools.js +108 -0
  47. package/dist/tools/profile-tools.js.map +1 -0
  48. package/dist/tools/query-tools.d.ts +6 -0
  49. package/dist/tools/query-tools.js +96 -0
  50. package/dist/tools/query-tools.js.map +1 -0
  51. package/dist/types.d.ts +444 -0
  52. package/dist/types.js +191 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +47 -0
  55. package/watashi-db-cowork-plugin.zip +0 -0
@@ -0,0 +1,104 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { DB_PATH, DB_DIR } from "../constants.js";
5
+ import { getAllActiveClaims, searchClaims, listDecisions, getStats, } from "../database/queries.js";
6
+ /**
7
+ * エクスポート・バックアップ関連ツールを登録
8
+ */
9
+ export function registerExportTools(server) {
10
+ // watashi_backup_db: SQLiteファイルのバックアップ
11
+ server.tool("watashi_backup_db", "わたしDBのSQLiteファイルをバックアップする。タイムスタンプ付きのコピーを作成する。", {
12
+ destination: z.string().optional().describe("バックアップ先ディレクトリ(省略時はDBと同じディレクトリ)"),
13
+ }, async (params) => {
14
+ if (!fs.existsSync(DB_PATH)) {
15
+ return {
16
+ content: [{
17
+ type: "text",
18
+ text: JSON.stringify({ success: false, error: "DBファイルが見つかりません" }),
19
+ }],
20
+ isError: true,
21
+ };
22
+ }
23
+ const destDir = params.destination ?? DB_DIR;
24
+ if (!fs.existsSync(destDir)) {
25
+ fs.mkdirSync(destDir, { recursive: true });
26
+ }
27
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
28
+ const backupName = `watashi_backup_${timestamp}.db`;
29
+ const backupPath = path.join(destDir, backupName);
30
+ fs.copyFileSync(DB_PATH, backupPath);
31
+ const stats = fs.statSync(backupPath);
32
+ return {
33
+ content: [{
34
+ type: "text",
35
+ text: JSON.stringify({
36
+ success: true,
37
+ message: `バックアップを作成しました`,
38
+ backup_path: backupPath,
39
+ size_bytes: stats.size,
40
+ }, null, 2),
41
+ }],
42
+ };
43
+ });
44
+ // watashi_export_json: 全データのJSONエクスポート
45
+ server.tool("watashi_export_json", "わたしDBの全アクティブデータをJSON形式でエクスポートする。Claim・Decision・統計情報を含む。", {
46
+ destination: z.string().optional().describe("出力先ファイルパス(省略時はDBディレクトリに保存)"),
47
+ include_retracted: z.boolean().default(false).describe("撤回済みClaimも含めるか"),
48
+ }, async (params) => {
49
+ const stats = getStats();
50
+ // Claims取得
51
+ const activeClaims = getAllActiveClaims();
52
+ let allClaims = activeClaims;
53
+ if (params.include_retracted) {
54
+ const retracted = searchClaims({ status: "retracted", limit: 10000 });
55
+ const superseded = searchClaims({ status: "superseded", limit: 10000 });
56
+ allClaims = [...activeClaims, ...retracted, ...superseded];
57
+ }
58
+ // Decisions取得
59
+ const activeDecisions = listDecisions({ status: "active", limit: 10000 });
60
+ let allDecisions = activeDecisions;
61
+ if (params.include_retracted) {
62
+ const reversed = listDecisions({ status: "reversed", limit: 10000 });
63
+ const obsolete = listDecisions({ status: "obsolete", limit: 10000 });
64
+ allDecisions = [...activeDecisions, ...reversed, ...obsolete];
65
+ }
66
+ const exportData = {
67
+ exported_at: new Date().toISOString(),
68
+ version: "0.1.0",
69
+ stats,
70
+ claims: allClaims.map(c => ({
71
+ ...c,
72
+ })),
73
+ decisions: allDecisions.map(d => ({
74
+ ...d,
75
+ alternatives: JSON.parse(d.alternatives),
76
+ related_claim_ids: JSON.parse(d.related_claim_ids),
77
+ })),
78
+ };
79
+ // ファイルに保存する場合
80
+ if (params.destination !== undefined || true) {
81
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
82
+ const defaultPath = path.join(DB_DIR, `watashi_export_${timestamp}.json`);
83
+ const destPath = params.destination ?? defaultPath;
84
+ const destDir2 = path.dirname(destPath);
85
+ if (!fs.existsSync(destDir2)) {
86
+ fs.mkdirSync(destDir2, { recursive: true });
87
+ }
88
+ fs.writeFileSync(destPath, JSON.stringify(exportData, null, 2), "utf-8");
89
+ return {
90
+ content: [{
91
+ type: "text",
92
+ text: JSON.stringify({
93
+ success: true,
94
+ message: `JSONエクスポートを保存しました`,
95
+ export_path: destPath,
96
+ claims_count: allClaims.length,
97
+ decisions_count: allDecisions.length,
98
+ }, null, 2),
99
+ }],
100
+ };
101
+ }
102
+ });
103
+ }
104
+ //# sourceMappingURL=export-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-tools.js","sourceRoot":"","sources":["../../src/tools/export-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * プロファイル関連ツール(get_profile_summary / store_preference)を登録
4
+ */
5
+ export declare function registerProfileTools(server: McpServer): void;
6
+ //# sourceMappingURL=profile-tools.d.ts.map
@@ -0,0 +1,108 @@
1
+ import { GetProfileSummarySchema, StorePreferenceSchema, } from "../types.js";
2
+ import { searchClaims, insertClaim, getStats, insertAuditLog, } from "../database/queries.js";
3
+ import { CLAIM_CATEGORIES } from "../constants.js";
4
+ import { buildProvenance } from "../provenance.js";
5
+ /**
6
+ * プロファイル関連ツール(get_profile_summary / store_preference)を登録
7
+ */
8
+ export function registerProfileTools(server) {
9
+ // watashi_get_profile_summary: プロファイル全体像(セッション開始時に推奨)
10
+ server.tool("watashi_get_profile_summary", "ユーザーのプロファイル全体像をMarkdown形式で取得する。新しいセッション開始時に呼び出すことで、ユーザーの好み・スキル・価値観を把握できる。", GetProfileSummarySchema.shape, async (params) => {
11
+ const stats = getStats();
12
+ // カテゴリごとにClaimを取得
13
+ const sections = [];
14
+ sections.push("# わたしプロファイル\n");
15
+ if (stats.active_claims === 0) {
16
+ sections.push("まだプロファイル情報が登録されていません。");
17
+ sections.push("`watashi_store_claim` または `watashi_store_preference` でユーザー情報を登録してください。\n");
18
+ }
19
+ else {
20
+ for (const category of CLAIM_CATEGORIES) {
21
+ const claims = searchClaims({
22
+ category,
23
+ scope: params.scope,
24
+ status: "active",
25
+ limit: 100,
26
+ });
27
+ if (claims.length === 0)
28
+ continue;
29
+ // カテゴリ名を日本語に変換
30
+ const categoryLabel = getCategoryLabel(category);
31
+ sections.push(`## ${categoryLabel}\n`);
32
+ for (const claim of claims) {
33
+ const scopeTag = claim.scope !== "global" ? ` [${claim.scope}]` : "";
34
+ const confidenceTag = claim.confidence < 0.8 ? ` (確信度: ${claim.confidence})` : "";
35
+ sections.push(`- **${claim.subject}** ${claim.predicate} ${claim.object}${scopeTag}${confidenceTag}`);
36
+ }
37
+ sections.push("");
38
+ }
39
+ }
40
+ // 統計情報
41
+ sections.push("## 統計\n");
42
+ sections.push(`- アクティブClaim数: ${stats.active_claims}`);
43
+ sections.push(`- 撤回済み: ${stats.retracted_claims}`);
44
+ sections.push(`- 意思決定ログ: ${stats.active_decisions}`);
45
+ sections.push(`- 変更履歴: ${stats.total_history_entries}`);
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: sections.join("\n"),
51
+ },
52
+ ],
53
+ };
54
+ });
55
+ // watashi_store_preference: 好みの簡易登録ショートカット
56
+ server.tool("watashi_store_preference", "ユーザーの好みを簡易登録する。自然言語のpreference文を'user prefers <内容>'のClaim形式で自動記録する。", StorePreferenceSchema.shape, async (params, extra) => {
57
+ // 2026-02-11 追加: サーバー側でProvenance(来歴)を自動付与
58
+ const provenance = buildProvenance(extra.sessionId);
59
+ const claim = insertClaim({
60
+ subject: "user",
61
+ predicate: "prefers",
62
+ object: params.preference,
63
+ category: "preference",
64
+ scope: params.scope ?? "global",
65
+ confidence: 0.9,
66
+ source_tool: params.source_tool,
67
+ client_name: provenance.client_name,
68
+ client_version: provenance.client_version,
69
+ });
70
+ // 監査ログ記録
71
+ insertAuditLog({
72
+ operation: "create",
73
+ entity_type: "claim",
74
+ entity_id: claim.id,
75
+ summary: `user prefers ${params.preference}`,
76
+ provenance,
77
+ source_tool: params.source_tool,
78
+ });
79
+ return {
80
+ content: [
81
+ {
82
+ type: "text",
83
+ text: JSON.stringify({
84
+ success: true,
85
+ message: `好みを登録しました: ${params.preference}`,
86
+ claim,
87
+ }, null, 2),
88
+ },
89
+ ],
90
+ };
91
+ });
92
+ }
93
+ /**
94
+ * カテゴリの日本語ラベルを取得
95
+ */
96
+ function getCategoryLabel(category) {
97
+ const labels = {
98
+ preference: "好み・設定 (Preference)",
99
+ identity: "アイデンティティ (Identity)",
100
+ skill: "スキル・能力 (Skill)",
101
+ value: "価値観・信条 (Value)",
102
+ workflow: "ワークフロー (Workflow)",
103
+ knowledge: "知識 (Knowledge)",
104
+ custom: "カスタム (Custom)",
105
+ };
106
+ return labels[category] ?? category;
107
+ }
108
+ //# sourceMappingURL=profile-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-tools.js","sourceRoot":"","sources":["../../src/tools/profile-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * クエリ関連ツール(query_context / search / get)を登録
4
+ */
5
+ export declare function registerQueryTools(server: McpServer): void;
6
+ //# sourceMappingURL=query-tools.d.ts.map
@@ -0,0 +1,96 @@
1
+ import { QueryContextSchema, SearchClaimsSchema, GetClaimSchema, } from "../types.js";
2
+ import { queryContext, searchClaims, getClaimById, getClaimHistory, } from "../database/queries.js";
3
+ /**
4
+ * クエリ関連ツール(query_context / search / get)を登録
5
+ */
6
+ export function registerQueryTools(server) {
7
+ // watashi_query_context: トピックに関連するコンテキスト取得
8
+ server.tool("watashi_query_context", "トピックに関連するユーザーコンテキストをFTS5全文検索で取得する。セッション開始時やトピック変更時に呼び出す。", QueryContextSchema.shape, async (params) => {
9
+ const claims = queryContext(params.topic, params.scope, params.limit ?? 20);
10
+ if (claims.length === 0) {
11
+ return {
12
+ content: [
13
+ {
14
+ type: "text",
15
+ text: JSON.stringify({
16
+ topic: params.topic,
17
+ results: [],
18
+ message: `'${params.topic}' に関連するコンテキストは見つかりませんでした`,
19
+ }, null, 2),
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: JSON.stringify({
29
+ topic: params.topic,
30
+ count: claims.length,
31
+ results: claims.map((c) => ({
32
+ id: c.id,
33
+ claim: `${c.subject} ${c.predicate} ${c.object}`,
34
+ category: c.category,
35
+ scope: c.scope,
36
+ confidence: c.confidence,
37
+ evidence: c.evidence,
38
+ })),
39
+ }, null, 2),
40
+ },
41
+ ],
42
+ };
43
+ });
44
+ // watashi_search_claims: Claim条件検索
45
+ server.tool("watashi_search_claims", "Claimをカテゴリ・スコープ・ステータス・テキストで条件検索する。", SearchClaimsSchema.shape, async (params) => {
46
+ const claims = searchClaims({
47
+ category: params.category,
48
+ scope: params.scope,
49
+ status: params.status ?? "active",
50
+ query: params.query,
51
+ limit: params.limit ?? 50,
52
+ });
53
+ return {
54
+ content: [
55
+ {
56
+ type: "text",
57
+ text: JSON.stringify({
58
+ count: claims.length,
59
+ results: claims,
60
+ }, null, 2),
61
+ },
62
+ ],
63
+ };
64
+ });
65
+ // watashi_get_claim: 特定Claim詳細+変更履歴
66
+ server.tool("watashi_get_claim", "特定のClaimの詳細情報と変更履歴を取得する。", GetClaimSchema.shape, async (params) => {
67
+ const claim = getClaimById(params.id);
68
+ if (!claim) {
69
+ return {
70
+ content: [
71
+ {
72
+ type: "text",
73
+ text: JSON.stringify({
74
+ success: false,
75
+ error: `Claim ID '${params.id}' が見つかりません`,
76
+ }),
77
+ },
78
+ ],
79
+ isError: true,
80
+ };
81
+ }
82
+ const history = getClaimHistory(params.id);
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: JSON.stringify({
88
+ claim,
89
+ history,
90
+ }, null, 2),
91
+ },
92
+ ],
93
+ };
94
+ });
95
+ }
96
+ //# sourceMappingURL=query-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-tools.js","sourceRoot":"","sources":["../../src/tools/query-tools.ts"],"names":[],"mappings":"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"}