watashi-db 0.0.5 → 0.0.7
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-docs/CODEX_INTEGRATION.md +116 -0
- package/README.md +1 -0
- package/cowork-plugin/.claude-plugin/plugin.json +1 -1
- package/cowork-plugin/hooks/hooks.json +11 -0
- package/cowork-plugin/skills/recall/SKILL.md +33 -0
- package/dist/config/instance.d.ts +10 -0
- package/dist/config/instance.js +39 -0
- package/dist/config/instance.js.map +1 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.js +49 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +353 -0
- package/dist/config/schema.js +69 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +116 -0
- package/dist/config/types.js +37 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validator.d.ts +22 -0
- package/dist/config/validator.js +183 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/constants.d.ts +7 -4
- package/dist/constants.js +17 -4
- package/dist/constants.js.map +1 -1
- package/dist/context-pack.d.ts +48 -0
- package/dist/context-pack.js +274 -0
- package/dist/context-pack.js.map +1 -0
- package/dist/database/connection.d.ts +9 -1
- package/dist/database/connection.js +23 -2
- package/dist/database/connection.js.map +1 -1
- package/dist/database/queries-core.d.ts +182 -0
- package/dist/database/queries-core.js +929 -0
- package/dist/database/queries-core.js.map +1 -0
- package/dist/database/queries.d.ts +41 -96
- package/dist/database/queries.js +43 -663
- package/dist/database/queries.js.map +1 -1
- package/dist/database/schema.js +858 -1
- package/dist/database/schema.js.map +1 -1
- package/dist/hook.d.ts +7 -0
- package/dist/hook.js +41 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.js +16 -53
- package/dist/index.js.map +1 -1
- package/dist/lint.d.ts +40 -0
- package/dist/lint.js +114 -0
- package/dist/lint.js.map +1 -0
- package/dist/policy.d.ts +48 -0
- package/dist/policy.js +175 -0
- package/dist/policy.js.map +1 -0
- package/dist/prompts/bootstrap-prompts.js +2 -21
- package/dist/prompts/bootstrap-prompts.js.map +1 -1
- package/dist/provenance.js +1 -3
- package/dist/provenance.js.map +1 -1
- package/dist/resources/context-resources.js +14 -5
- package/dist/resources/context-resources.js.map +1 -1
- package/dist/scoring.d.ts +21 -0
- package/dist/scoring.js +35 -0
- package/dist/scoring.js.map +1 -0
- package/dist/server-instructions.d.ts +7 -0
- package/dist/server-instructions.js +33 -0
- package/dist/server-instructions.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +95 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +5 -0
- package/dist/setup.js +157 -0
- package/dist/setup.js.map +1 -0
- package/dist/store/federation.d.ts +66 -0
- package/dist/store/federation.js +291 -0
- package/dist/store/federation.js.map +1 -0
- package/dist/store/merge.d.ts +36 -0
- package/dist/store/merge.js +168 -0
- package/dist/store/merge.js.map +1 -0
- package/dist/store/session-state.d.ts +35 -0
- package/dist/store/session-state.js +69 -0
- package/dist/store/session-state.js.map +1 -0
- package/dist/store/store-manager.d.ts +46 -0
- package/dist/store/store-manager.js +108 -0
- package/dist/store/store-manager.js.map +1 -0
- package/dist/store/sync-manager.d.ts +77 -0
- package/dist/store/sync-manager.js +298 -0
- package/dist/store/sync-manager.js.map +1 -0
- package/dist/tools/claim-tools.js +89 -9
- package/dist/tools/claim-tools.js.map +1 -1
- package/dist/tools/decision-tools.js +47 -6
- package/dist/tools/decision-tools.js.map +1 -1
- package/dist/tools/episode-tools.js +35 -5
- package/dist/tools/episode-tools.js.map +1 -1
- package/dist/tools/export-tools.js +21 -23
- package/dist/tools/export-tools.js.map +1 -1
- package/dist/tools/profile-tools.js +39 -8
- package/dist/tools/profile-tools.js.map +1 -1
- package/dist/tools/promote-tools.d.ts +10 -0
- package/dist/tools/promote-tools.js +289 -0
- package/dist/tools/promote-tools.js.map +1 -0
- package/dist/tools/query-tools.js +64 -14
- package/dist/tools/query-tools.js.map +1 -1
- package/dist/tools/store-tools.d.ts +9 -0
- package/dist/tools/store-tools.js +82 -0
- package/dist/tools/store-tools.js.map +1 -0
- package/dist/tools/sync-tools.d.ts +9 -0
- package/dist/tools/sync-tools.js +55 -0
- package/dist/tools/sync-tools.js.map +1 -0
- package/dist/tools/theory-tools.d.ts +7 -0
- package/dist/tools/theory-tools.js +155 -0
- package/dist/tools/theory-tools.js.map +1 -0
- package/dist/types.d.ts +174 -24
- package/dist/types.js +61 -8
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.json の Zod スキーマ定義
|
|
3
|
+
* マルチStore構成を宣言的に定義するための型とバリデーション
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
// --- Store 定義 ---
|
|
7
|
+
/** 同期設定 */
|
|
8
|
+
export const SyncConfigSchema = z.object({
|
|
9
|
+
enabled: z.boolean().default(true),
|
|
10
|
+
destination: z.string().min(1, "sync.destinationは必須です"),
|
|
11
|
+
generations: z.number().int().min(1).default(3),
|
|
12
|
+
}).strict();
|
|
13
|
+
/** ローカルSQLiteファイル */
|
|
14
|
+
const LocalStoreSchema = z.object({
|
|
15
|
+
type: z.literal("local"),
|
|
16
|
+
path: z.string().min(1, "pathは必須です"),
|
|
17
|
+
sync: SyncConfigSchema.optional(),
|
|
18
|
+
}).strict();
|
|
19
|
+
/** リモートDB接続(将来用・型定義のみ) */
|
|
20
|
+
const RemoteDbStoreSchema = z.object({
|
|
21
|
+
type: z.literal("remote-db"),
|
|
22
|
+
url: z.string().url(),
|
|
23
|
+
}).strict();
|
|
24
|
+
/** リモートMCPサーバー(将来用・型定義のみ) */
|
|
25
|
+
const RemoteMcpStoreSchema = z.object({
|
|
26
|
+
type: z.literal("remote-mcp"),
|
|
27
|
+
url: z.string().url(),
|
|
28
|
+
}).strict();
|
|
29
|
+
/** Store discriminated union */
|
|
30
|
+
export const StoreSchema = z.discriminatedUnion("type", [
|
|
31
|
+
LocalStoreSchema,
|
|
32
|
+
RemoteDbStoreSchema,
|
|
33
|
+
RemoteMcpStoreSchema,
|
|
34
|
+
]);
|
|
35
|
+
// --- アクセスモード ---
|
|
36
|
+
export const AccessModeSchema = z.enum(["read-write", "read-only"]);
|
|
37
|
+
// --- Context 定義 ---
|
|
38
|
+
export const ContextSchema = z.object({
|
|
39
|
+
stores: z.record(z.string(), AccessModeSchema).refine((s) => Object.keys(s).length > 0, { message: "contextには少なくとも1つのstoreが必要です" }),
|
|
40
|
+
default_store: z.string().min(1, "default_storeは必須です"),
|
|
41
|
+
}).strict();
|
|
42
|
+
// --- クライアントポリシー設定 ---
|
|
43
|
+
/** アクセス制御(categories/scopes で許可範囲を指定) */
|
|
44
|
+
const PolicyAccessSchema = z.object({
|
|
45
|
+
categories: z.array(z.string()).optional(),
|
|
46
|
+
scopes: z.array(z.string()).optional(),
|
|
47
|
+
}).strict();
|
|
48
|
+
/** クライアント別ポリシー(read/write それぞれに制御) */
|
|
49
|
+
const ClientPolicySchema = z.object({
|
|
50
|
+
read: z.union([PolicyAccessSchema, z.literal("none")]).default({}),
|
|
51
|
+
write: z.union([PolicyAccessSchema, z.literal("none")]).default({}),
|
|
52
|
+
}).strict();
|
|
53
|
+
// --- Lint 設定 ---
|
|
54
|
+
export const LintConfigSchema = z.object({
|
|
55
|
+
secret_detection: z.enum(["block", "warn", "off"]).default("warn"),
|
|
56
|
+
}).strict();
|
|
57
|
+
// --- Config 全体 ---
|
|
58
|
+
/** Store名・Context名に使用可能な文字パターン */
|
|
59
|
+
export const STORE_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
60
|
+
/** Store名のキーバリデーション付き z.record */
|
|
61
|
+
const StoreNameKeySchema = z.string().regex(STORE_NAME_PATTERN, "Store名は英数字・アンダースコア・ハイフンのみ使用できます");
|
|
62
|
+
export const RawConfigSchema = z.object({
|
|
63
|
+
stores: z.record(StoreNameKeySchema, StoreSchema).refine((s) => Object.keys(s).length > 0, { message: "少なくとも1つのstoreが必要です" }),
|
|
64
|
+
contexts: z.record(z.string(), ContextSchema).refine((c) => Object.keys(c).length > 0, { message: "少なくとも1つのcontextが必要です" }),
|
|
65
|
+
default_context: z.string().min(1, "default_contextは必須です"),
|
|
66
|
+
lint: LintConfigSchema.optional(),
|
|
67
|
+
client_policies: z.record(z.string(), ClientPolicySchema).optional(),
|
|
68
|
+
}).strict();
|
|
69
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store設定の型定義・Zodスキーマ
|
|
3
|
+
* config.json の構造を定義する。
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export declare const STORE_KINDS: readonly ["sqlite-local", "sqlite-shared", "remote-mcp"];
|
|
7
|
+
export type StoreKind = typeof STORE_KINDS[number];
|
|
8
|
+
export declare const StoreConfigSchema: z.ZodObject<{
|
|
9
|
+
kind: z.ZodEnum<["sqlite-local", "sqlite-shared", "remote-mcp"]>;
|
|
10
|
+
path: z.ZodOptional<z.ZodString>;
|
|
11
|
+
label: z.ZodOptional<z.ZodString>;
|
|
12
|
+
writable: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodLiteral<"instance-lock">]>>;
|
|
13
|
+
url: z.ZodOptional<z.ZodString>;
|
|
14
|
+
auth: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
17
|
+
writable: boolean | "instance-lock";
|
|
18
|
+
path?: string | undefined;
|
|
19
|
+
label?: string | undefined;
|
|
20
|
+
url?: string | undefined;
|
|
21
|
+
auth?: Record<string, string> | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
24
|
+
path?: string | undefined;
|
|
25
|
+
label?: string | undefined;
|
|
26
|
+
writable?: boolean | "instance-lock" | undefined;
|
|
27
|
+
url?: string | undefined;
|
|
28
|
+
auth?: Record<string, string> | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export declare const SearchConfigSchema: z.ZodObject<{
|
|
31
|
+
targets: z.ZodArray<z.ZodString, "many">;
|
|
32
|
+
priority: z.ZodArray<z.ZodString, "many">;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
targets: string[];
|
|
35
|
+
priority: string[];
|
|
36
|
+
}, {
|
|
37
|
+
targets: string[];
|
|
38
|
+
priority: string[];
|
|
39
|
+
}>;
|
|
40
|
+
export declare const WatashiConfigSchema: z.ZodObject<{
|
|
41
|
+
defaultStore: z.ZodDefault<z.ZodString>;
|
|
42
|
+
stores: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
43
|
+
kind: z.ZodEnum<["sqlite-local", "sqlite-shared", "remote-mcp"]>;
|
|
44
|
+
path: z.ZodOptional<z.ZodString>;
|
|
45
|
+
label: z.ZodOptional<z.ZodString>;
|
|
46
|
+
writable: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodLiteral<"instance-lock">]>>;
|
|
47
|
+
url: z.ZodOptional<z.ZodString>;
|
|
48
|
+
auth: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
49
|
+
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
51
|
+
writable: boolean | "instance-lock";
|
|
52
|
+
path?: string | undefined;
|
|
53
|
+
label?: string | undefined;
|
|
54
|
+
url?: string | undefined;
|
|
55
|
+
auth?: Record<string, string> | undefined;
|
|
56
|
+
}, {
|
|
57
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
58
|
+
path?: string | undefined;
|
|
59
|
+
label?: string | undefined;
|
|
60
|
+
writable?: boolean | "instance-lock" | undefined;
|
|
61
|
+
url?: string | undefined;
|
|
62
|
+
auth?: Record<string, string> | undefined;
|
|
63
|
+
}>>;
|
|
64
|
+
search: z.ZodOptional<z.ZodObject<{
|
|
65
|
+
targets: z.ZodArray<z.ZodString, "many">;
|
|
66
|
+
priority: z.ZodArray<z.ZodString, "many">;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
targets: string[];
|
|
69
|
+
priority: string[];
|
|
70
|
+
}, {
|
|
71
|
+
targets: string[];
|
|
72
|
+
priority: string[];
|
|
73
|
+
}>>;
|
|
74
|
+
}, "strip", z.ZodTypeAny, {
|
|
75
|
+
defaultStore: string;
|
|
76
|
+
stores: Record<string, {
|
|
77
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
78
|
+
writable: boolean | "instance-lock";
|
|
79
|
+
path?: string | undefined;
|
|
80
|
+
label?: string | undefined;
|
|
81
|
+
url?: string | undefined;
|
|
82
|
+
auth?: Record<string, string> | undefined;
|
|
83
|
+
}>;
|
|
84
|
+
search?: {
|
|
85
|
+
targets: string[];
|
|
86
|
+
priority: string[];
|
|
87
|
+
} | undefined;
|
|
88
|
+
}, {
|
|
89
|
+
stores: Record<string, {
|
|
90
|
+
kind: "sqlite-local" | "sqlite-shared" | "remote-mcp";
|
|
91
|
+
path?: string | undefined;
|
|
92
|
+
label?: string | undefined;
|
|
93
|
+
writable?: boolean | "instance-lock" | undefined;
|
|
94
|
+
url?: string | undefined;
|
|
95
|
+
auth?: Record<string, string> | undefined;
|
|
96
|
+
}>;
|
|
97
|
+
defaultStore?: string | undefined;
|
|
98
|
+
search?: {
|
|
99
|
+
targets: string[];
|
|
100
|
+
priority: string[];
|
|
101
|
+
} | undefined;
|
|
102
|
+
}>;
|
|
103
|
+
export type StoreConfig = z.infer<typeof StoreConfigSchema>;
|
|
104
|
+
export type SearchConfig = z.infer<typeof SearchConfigSchema>;
|
|
105
|
+
export type WatashiConfig = z.infer<typeof WatashiConfigSchema>;
|
|
106
|
+
export interface StoreInfo {
|
|
107
|
+
id: string;
|
|
108
|
+
kind: StoreKind;
|
|
109
|
+
label: string;
|
|
110
|
+
path?: string;
|
|
111
|
+
writable: boolean | "instance-lock";
|
|
112
|
+
isActive: boolean;
|
|
113
|
+
isDefault: boolean;
|
|
114
|
+
effectiveWritable: boolean;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store設定の型定義・Zodスキーマ
|
|
3
|
+
* config.json の構造を定義する。
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
// Store kind の定義
|
|
7
|
+
// 2026-02-15 追加: マルチStore対応(v0.1.0)
|
|
8
|
+
export const STORE_KINDS = [
|
|
9
|
+
"sqlite-local", // ローカルSQLite
|
|
10
|
+
"sqlite-shared", // 共有ファイルシステム上のSQLite(Google Drive等)
|
|
11
|
+
"remote-mcp", // リモートMCPサーバ(Phase 2で実装)
|
|
12
|
+
];
|
|
13
|
+
// 個別Store設定のZodスキーマ
|
|
14
|
+
export const StoreConfigSchema = z.object({
|
|
15
|
+
kind: z.enum(STORE_KINDS).describe("Storeの種別"),
|
|
16
|
+
path: z.string().optional().describe("SQLiteファイルパス(sqlite-local/sqlite-shared用)"),
|
|
17
|
+
label: z.string().optional().describe("表示用ラベル"),
|
|
18
|
+
writable: z.union([
|
|
19
|
+
z.boolean(),
|
|
20
|
+
z.literal("instance-lock"),
|
|
21
|
+
]).default(true).describe("書き込み可否(true/false/'instance-lock')"),
|
|
22
|
+
// Phase 2用(remote-mcp)
|
|
23
|
+
url: z.string().optional().describe("リモートMCPサーバURL(Phase 2)"),
|
|
24
|
+
auth: z.record(z.string()).optional().describe("認証情報(Phase 2)"),
|
|
25
|
+
});
|
|
26
|
+
// 検索設定のZodスキーマ
|
|
27
|
+
export const SearchConfigSchema = z.object({
|
|
28
|
+
targets: z.array(z.string()).describe("フェデレーション検索対象のStore ID"),
|
|
29
|
+
priority: z.array(z.string()).describe("検索結果の優先順位"),
|
|
30
|
+
});
|
|
31
|
+
// 設定ファイル全体のZodスキーマ
|
|
32
|
+
export const WatashiConfigSchema = z.object({
|
|
33
|
+
defaultStore: z.string().default("local").describe("デフォルトStore ID"),
|
|
34
|
+
stores: z.record(z.string(), StoreConfigSchema).describe("Store定義"),
|
|
35
|
+
search: SearchConfigSchema.optional().describe("検索設定"),
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iBAAiB;AACjB,oCAAoC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,cAAc,EAAI,aAAa;IAC/B,eAAe,EAAG,oCAAoC;IACtD,YAAY,EAAM,yBAAyB;CACnC,CAAC;AAIX,oBAAoB;AACpB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;QAChB,CAAC,CAAC,OAAO,EAAE;QACX,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;KAC3B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC/D,uBAAuB;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC7D,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAChE,CAAC,CAAC;AAEH,eAAe;AACf,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC9D,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;CACpD,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IACnE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;IACnE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;CACvD,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ResolvedConfig } from "./schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Config バリデーションエラー(全エラーを一括報告)
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigValidationError extends Error {
|
|
6
|
+
readonly errors: string[];
|
|
7
|
+
constructor(errors: string[]);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* チルダ展開: ~/xxx → os.homedir()/xxx
|
|
11
|
+
*/
|
|
12
|
+
export declare function expandTilde(p: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* クライアントポリシーのスコープパターンが有効かチェック
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidScopePattern(pattern: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* RawConfig を検証し、パス展開済みの ResolvedConfig を返す
|
|
19
|
+
* Zodスキーマ検証 + 参照整合性チェック を一括実行
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateAndResolveConfig(raw: unknown): ResolvedConfig;
|
|
22
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.json バリデーション
|
|
3
|
+
* Zodスキーマによる構文チェック + 参照整合性チェック + パス正規化
|
|
4
|
+
*/
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import { RawConfigSchema } from "./schema.js";
|
|
8
|
+
import { CLAIM_CATEGORIES } from "../constants.js";
|
|
9
|
+
/**
|
|
10
|
+
* Config バリデーションエラー(全エラーを一括報告)
|
|
11
|
+
*/
|
|
12
|
+
export class ConfigValidationError extends Error {
|
|
13
|
+
errors;
|
|
14
|
+
constructor(errors) {
|
|
15
|
+
super(`config.json バリデーションエラー:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
16
|
+
this.errors = errors;
|
|
17
|
+
this.name = "ConfigValidationError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* チルダ展開: ~/xxx → os.homedir()/xxx
|
|
22
|
+
*/
|
|
23
|
+
export function expandTilde(p) {
|
|
24
|
+
if (p.startsWith("~/") || p === "~") {
|
|
25
|
+
return path.join(os.homedir(), p.slice(1));
|
|
26
|
+
}
|
|
27
|
+
return p;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* クライアントポリシーのスコープパターンが有効かチェック
|
|
31
|
+
*/
|
|
32
|
+
export function isValidScopePattern(pattern) {
|
|
33
|
+
if (pattern === "global" || pattern === "temporal")
|
|
34
|
+
return true;
|
|
35
|
+
if (/^(persona|project|tool):\*$/.test(pattern))
|
|
36
|
+
return true;
|
|
37
|
+
if (/^(persona|project|tool):[a-zA-Z0-9_\-\.]+$/.test(pattern))
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* パスを正規化: チルダ展開 → 絶対パス化 → normalize
|
|
43
|
+
*/
|
|
44
|
+
function normalizePath(p) {
|
|
45
|
+
const expanded = expandTilde(p);
|
|
46
|
+
return path.resolve(expanded);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* RawConfig を検証し、パス展開済みの ResolvedConfig を返す
|
|
50
|
+
* Zodスキーマ検証 + 参照整合性チェック を一括実行
|
|
51
|
+
*/
|
|
52
|
+
export function validateAndResolveConfig(raw) {
|
|
53
|
+
// 1. Zodスキーマ検証
|
|
54
|
+
const parseResult = RawConfigSchema.safeParse(raw);
|
|
55
|
+
if (!parseResult.success) {
|
|
56
|
+
const zodErrors = parseResult.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`);
|
|
57
|
+
throw new ConfigValidationError(zodErrors);
|
|
58
|
+
}
|
|
59
|
+
const config = parseResult.data;
|
|
60
|
+
const errors = [];
|
|
61
|
+
// 2. 参照整合性チェック
|
|
62
|
+
// default_context が contexts 内に存在するか
|
|
63
|
+
if (!(config.default_context in config.contexts)) {
|
|
64
|
+
errors.push(`default_context "${config.default_context}" がcontextsに定義されていません`);
|
|
65
|
+
}
|
|
66
|
+
// 各 context のチェック
|
|
67
|
+
for (const [ctxName, ctx] of Object.entries(config.contexts)) {
|
|
68
|
+
// default_store が stores 内に存在するか
|
|
69
|
+
if (!(ctx.default_store in config.stores)) {
|
|
70
|
+
errors.push(`contexts.${ctxName}.default_store "${ctx.default_store}" がstoresに定義されていません`);
|
|
71
|
+
}
|
|
72
|
+
// default_store が read-write であるか
|
|
73
|
+
const defaultAccess = ctx.stores[ctx.default_store];
|
|
74
|
+
if (defaultAccess !== undefined && defaultAccess !== "read-write") {
|
|
75
|
+
errors.push(`contexts.${ctxName}.default_store "${ctx.default_store}" はread-writeである必要があります(現在: ${defaultAccess})`);
|
|
76
|
+
}
|
|
77
|
+
// default_store が context の stores に含まれているか
|
|
78
|
+
if (!(ctx.default_store in ctx.stores)) {
|
|
79
|
+
errors.push(`contexts.${ctxName}.default_store "${ctx.default_store}" がcontexts.${ctxName}.storesに含まれていません`);
|
|
80
|
+
}
|
|
81
|
+
// 各 store 参照が stores に存在するか
|
|
82
|
+
for (const storeName of Object.keys(ctx.stores)) {
|
|
83
|
+
if (!(storeName in config.stores)) {
|
|
84
|
+
errors.push(`contexts.${ctxName}.stores に参照された "${storeName}" がstoresに定義されていません`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 3. Store パスの正規化 & 重複チェック
|
|
89
|
+
const resolvedStores = {};
|
|
90
|
+
const normalizedPaths = new Map(); // normalizedPath → storeName
|
|
91
|
+
for (const [name, store] of Object.entries(config.stores)) {
|
|
92
|
+
if (store.type === "local") {
|
|
93
|
+
const normalized = normalizePath(store.path);
|
|
94
|
+
const existing = normalizedPaths.get(normalized);
|
|
95
|
+
if (existing) {
|
|
96
|
+
errors.push(`stores "${name}" と "${existing}" のパスが重複しています(正規化後: ${normalized})`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
normalizedPaths.set(normalized, name);
|
|
100
|
+
}
|
|
101
|
+
// sync設定のパス解決
|
|
102
|
+
let resolvedSync;
|
|
103
|
+
if (store.sync) {
|
|
104
|
+
const syncDest = normalizePath(store.sync.destination);
|
|
105
|
+
resolvedSync = {
|
|
106
|
+
enabled: store.sync.enabled,
|
|
107
|
+
destination: syncDest,
|
|
108
|
+
originalDestination: store.sync.destination,
|
|
109
|
+
generations: store.sync.generations,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
resolvedStores[name] = {
|
|
113
|
+
type: "local",
|
|
114
|
+
path: normalized,
|
|
115
|
+
originalPath: store.path,
|
|
116
|
+
sync: resolvedSync,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// remote-db / remote-mcp は将来対応: 現時点では明示的にエラーにする
|
|
120
|
+
if (store.type === "remote-db" || store.type === "remote-mcp") {
|
|
121
|
+
errors.push(`stores.${name}: type "${store.type}" は現在未実装です。localのみ対応しています`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// 4. ResolvedConfig 構築(エラーがあっても後段でまとめてthrowするため続行)
|
|
125
|
+
const resolvedContexts = {};
|
|
126
|
+
for (const [ctxName, ctx] of Object.entries(config.contexts)) {
|
|
127
|
+
resolvedContexts[ctxName] = {
|
|
128
|
+
stores: { ...ctx.stores },
|
|
129
|
+
default_store: ctx.default_store,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// 5. Lint設定の解決
|
|
133
|
+
const resolvedLint = config.lint
|
|
134
|
+
? { secret_detection: config.lint.secret_detection }
|
|
135
|
+
: undefined;
|
|
136
|
+
// 6. クライアントポリシーのバリデーション & パススルー
|
|
137
|
+
let resolvedClientPolicies;
|
|
138
|
+
if (config.client_policies) {
|
|
139
|
+
const validCategories = new Set(CLAIM_CATEGORIES);
|
|
140
|
+
for (const [clientName, policy] of Object.entries(config.client_policies)) {
|
|
141
|
+
// read/write の categories/scopes をチェック
|
|
142
|
+
for (const direction of ["read", "write"]) {
|
|
143
|
+
const access = policy[direction];
|
|
144
|
+
if (access === "none" || access === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
// categories のバリデーション
|
|
147
|
+
if (access.categories) {
|
|
148
|
+
for (const cat of access.categories) {
|
|
149
|
+
if (!validCategories.has(cat)) {
|
|
150
|
+
errors.push(`client_policies.${clientName}.${direction}.categories: "${cat}" は有効なカテゴリではありません(有効値: ${CLAIM_CATEGORIES.join(", ")})`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// scopes のバリデーション
|
|
155
|
+
if (access.scopes) {
|
|
156
|
+
for (const scope of access.scopes) {
|
|
157
|
+
if (!isValidScopePattern(scope)) {
|
|
158
|
+
errors.push(`client_policies.${clientName}.${direction}.scopes: "${scope}" は有効なスコープパターンではありません`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
resolvedClientPolicies = {};
|
|
165
|
+
for (const [clientName, policy] of Object.entries(config.client_policies)) {
|
|
166
|
+
resolvedClientPolicies[clientName] = {
|
|
167
|
+
read: policy.read ?? {},
|
|
168
|
+
write: policy.write ?? {},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (errors.length > 0) {
|
|
173
|
+
throw new ConfigValidationError(errors);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
stores: resolvedStores,
|
|
177
|
+
contexts: resolvedContexts,
|
|
178
|
+
default_context: config.default_context,
|
|
179
|
+
lint: resolvedLint,
|
|
180
|
+
client_policies: resolvedClientPolicies,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export declare const DB_DIR: string;
|
|
2
2
|
export declare const DB_PATH: string;
|
|
3
|
+
export declare const CONFIG_PATH: string;
|
|
4
|
+
export declare const BUSY_TIMEOUT_MS = 5000;
|
|
3
5
|
export declare const SERVER_NAME = "watashi-db";
|
|
4
|
-
export declare const SERVER_VERSION = "0.0.
|
|
6
|
+
export declare const SERVER_VERSION = "0.0.7";
|
|
5
7
|
export declare const CLAIM_CATEGORIES: readonly ["preference", "identity", "skill", "value", "workflow", "knowledge", "custom"];
|
|
6
|
-
export declare const CLAIM_SCOPES: readonly ["global", "project", "tool", "temporal"];
|
|
7
|
-
export declare const CLAIM_STATUSES: readonly ["active", "retracted", "superseded"];
|
|
8
|
-
export declare const DECISION_STATUSES: readonly ["active", "reversed", "obsolete"];
|
|
8
|
+
export declare const CLAIM_SCOPES: readonly ["global", "persona", "project", "tool", "temporal"];
|
|
9
|
+
export declare const CLAIM_STATUSES: readonly ["active", "retracted", "superseded", "promoted"];
|
|
10
|
+
export declare const DECISION_STATUSES: readonly ["active", "reversed", "obsolete", "promoted"];
|
|
11
|
+
export declare const THEORY_STATUSES: readonly ["active", "archived", "promoted"];
|
|
9
12
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
|
@@ -3,14 +3,15 @@ import os from "node:os";
|
|
|
3
3
|
// DBファイル配置: ~/.watashi-db/watashi.db(ユーザーホーム配下、プロジェクト非依存)
|
|
4
4
|
export const DB_DIR = path.join(os.homedir(), ".watashi-db");
|
|
5
5
|
export const DB_PATH = path.join(DB_DIR, "watashi.db");
|
|
6
|
+
// マルチStore設定ファイル
|
|
7
|
+
export const CONFIG_PATH = path.join(DB_DIR, "config.json");
|
|
8
|
+
// SQLite busy_timeout(ms)— 他プロセスがロック中でも指定時間まで待機
|
|
9
|
+
export const BUSY_TIMEOUT_MS = 5000;
|
|
6
10
|
// MCPサーバー情報
|
|
7
11
|
export const SERVER_NAME = "watashi-db";
|
|
8
12
|
// 2026-02-11 修正: 実態に合わせてv0.0.1に変更(Codexレビュー指摘)
|
|
9
13
|
// 元の実装: 0.1.0 としていたが、初期実装段階のため0.0.1が適切
|
|
10
|
-
|
|
11
|
-
// 元の実装: v0.0.4(Phase 3: テスト・README・LICENSE・エクスポート・npm化)
|
|
12
|
-
// v0.1.0はGitHub公開時に付与予定
|
|
13
|
-
export const SERVER_VERSION = "0.0.5";
|
|
14
|
+
export const SERVER_VERSION = "0.0.7";
|
|
14
15
|
// Claimのカテゴリ一覧
|
|
15
16
|
export const CLAIM_CATEGORIES = [
|
|
16
17
|
"preference", // 好み・設定
|
|
@@ -22,8 +23,12 @@ export const CLAIM_CATEGORIES = [
|
|
|
22
23
|
"custom", // カスタム
|
|
23
24
|
];
|
|
24
25
|
// Claimのスコープ種別
|
|
26
|
+
// 2026-02-19 修正: persona スコープ追加
|
|
27
|
+
// 元の実装: global, project, tool, temporal の4種
|
|
28
|
+
// persona はコミュニティ・アカウントに対したときの「わたし」を表すラベル
|
|
25
29
|
export const CLAIM_SCOPES = [
|
|
26
30
|
"global", // 全体に適用
|
|
31
|
+
"persona", // 特定のペルソナに適用(persona:<name>)
|
|
27
32
|
"project", // 特定プロジェクトに適用(project:<name>)
|
|
28
33
|
"tool", // 特定ツールに適用(tool:<name>)
|
|
29
34
|
"temporal", // 一時的に適用
|
|
@@ -33,11 +38,19 @@ export const CLAIM_STATUSES = [
|
|
|
33
38
|
"active", // 有効
|
|
34
39
|
"retracted", // 撤回済み
|
|
35
40
|
"superseded", // 後続に置き換え済み
|
|
41
|
+
"promoted", // 別Storeへ昇格済み
|
|
36
42
|
];
|
|
37
43
|
// 意思決定のステータス
|
|
38
44
|
export const DECISION_STATUSES = [
|
|
39
45
|
"active", // 有効
|
|
40
46
|
"reversed", // 撤回済み
|
|
41
47
|
"obsolete", // 廃止
|
|
48
|
+
"promoted", // 別Storeへ昇格済み
|
|
49
|
+
];
|
|
50
|
+
// Theoryのステータス
|
|
51
|
+
export const THEORY_STATUSES = [
|
|
52
|
+
"active", // 有効
|
|
53
|
+
"archived", // アーカイブ済み
|
|
54
|
+
"promoted", // 別Storeへ昇格済み
|
|
42
55
|
];
|
|
43
56
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,0DAA0D;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEvD,YAAY;AACZ,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,+CAA+C;AAC/C,uCAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,0DAA0D;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEvD,iBAAiB;AACjB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE5D,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,YAAY;AACZ,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,+CAA+C;AAC/C,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,eAAe;AACf,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAG,QAAQ;IACvB,UAAU,EAAK,gBAAgB;IAC/B,OAAO,EAAQ,SAAS;IACxB,OAAO,EAAQ,SAAS;IACxB,UAAU,EAAK,cAAc;IAC7B,WAAW,EAAI,QAAQ;IACvB,QAAQ,EAAO,OAAO;CACd,CAAC;AAEX,eAAe;AACf,gCAAgC;AAChC,4CAA4C;AAC5C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAO,QAAQ;IACvB,SAAS,EAAM,6BAA6B;IAC5C,SAAS,EAAM,8BAA8B;IAC7C,MAAM,EAAS,wBAAwB;IACvC,UAAU,EAAK,SAAS;CAChB,CAAC;AAEX,wBAAwB;AACxB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAO,KAAK;IACpB,WAAW,EAAI,OAAO;IACtB,YAAY,EAAG,YAAY;IAC3B,UAAU,EAAK,cAAc;CACrB,CAAC;AAEX,aAAa;AACb,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAO,KAAK;IACpB,UAAU,EAAK,OAAO;IACtB,UAAU,EAAK,KAAK;IACpB,UAAU,EAAK,cAAc;CACrB,CAAC;AAEX,eAAe;AACf,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAO,KAAK;IACpB,UAAU,EAAK,UAAU;IACzB,UAAU,EAAK,cAAc;CACrB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* コンテキスト予算API(Issue #15)
|
|
3
|
+
* トークン予算内でClaim/Decision/Episodeを統合ランキングし、
|
|
4
|
+
* 最も関連性の高いレコードをMarkdown形式で返す。
|
|
5
|
+
*/
|
|
6
|
+
import type { StoreManager } from "./store/store-manager.js";
|
|
7
|
+
import type { ClaimRow, DecisionRow, EpisodeRow, TheoryRow, ContextPackMode } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* 文字種別トークン推定。
|
|
10
|
+
* - ASCII文字: 4文字/token
|
|
11
|
+
* - 非ASCII文字(日本語等): 1.5文字/token
|
|
12
|
+
* 予算オーバーよりアンダーが安全なので保守的に推定。
|
|
13
|
+
*/
|
|
14
|
+
export declare function estimateTokens(text: string): number;
|
|
15
|
+
type DetailLevel = "compact" | "minimal";
|
|
16
|
+
export declare function renderClaim(claim: ClaimRow, detail: DetailLevel): string;
|
|
17
|
+
export declare function renderDecision(decision: DecisionRow, detail: DetailLevel): string;
|
|
18
|
+
export declare function renderEpisode(episode: EpisodeRow, detail: DetailLevel): string;
|
|
19
|
+
export declare function renderTheory(theory: TheoryRow, detail: DetailLevel): string;
|
|
20
|
+
interface ScoredItem<T> {
|
|
21
|
+
item: T;
|
|
22
|
+
score: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 予算内でスコア順にgreedy fill。
|
|
26
|
+
* 全体の残予算が30%以下になったらminimalに切り替え。
|
|
27
|
+
* @param usedTokensGlobal 他セクションで既に消費済みのトークン数(minimal判定に使用)
|
|
28
|
+
*/
|
|
29
|
+
export declare function greedyFill<T>(scoredItems: ScoredItem<T>[], renderFn: (item: T, detail: DetailLevel) => string, budget: number, totalBudget: number, usedTokensGlobal?: number): {
|
|
30
|
+
rendered: string[];
|
|
31
|
+
usedTokens: number;
|
|
32
|
+
};
|
|
33
|
+
export interface ContextPackResult {
|
|
34
|
+
markdown: string;
|
|
35
|
+
metadata: {
|
|
36
|
+
topic: string;
|
|
37
|
+
mode: ContextPackMode;
|
|
38
|
+
token_budget: number;
|
|
39
|
+
estimated_tokens: number;
|
|
40
|
+
included_claims: number;
|
|
41
|
+
included_decisions: number;
|
|
42
|
+
included_episodes: number;
|
|
43
|
+
included_theories: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export declare function buildContextPack(manager: StoreManager, contextName: string, topic: string, tokenBudget: number, mode: ContextPackMode, scope?: string): ContextPackResult;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=context-pack.d.ts.map
|