cckb 0.1.3 → 0.1.4

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/dist/index.d.ts CHANGED
@@ -3,6 +3,12 @@ interface InstallOptions {
3
3
  }
4
4
  declare function install(targetPath: string, options?: InstallOptions): Promise<void>;
5
5
 
6
+ interface DiscoverCommandOptions {
7
+ targetPath?: string;
8
+ verbose?: boolean;
9
+ }
10
+ declare function discover(options?: DiscoverCommandOptions): Promise<void>;
11
+
6
12
  declare class ConversationManager {
7
13
  private projectPath;
8
14
  constructor(projectPath: string);
@@ -125,6 +131,97 @@ declare class IndexManager {
125
131
  private parseTableToOverview;
126
132
  }
127
133
 
134
+ interface DiscoverOptions {
135
+ maxFiles?: number;
136
+ maxChunkSize?: number;
137
+ verbose?: boolean;
138
+ }
139
+ interface DiscoveryResult {
140
+ summary: Summary;
141
+ filesAnalyzed: number;
142
+ chunksProcessed: number;
143
+ duration: number;
144
+ integrated: boolean;
145
+ }
146
+ declare class AutoDiscover {
147
+ private projectPath;
148
+ private verbose;
149
+ constructor(projectPath: string, verbose?: boolean);
150
+ discover(options?: DiscoverOptions): Promise<DiscoveryResult>;
151
+ private analyzeChunk;
152
+ private parseResponse;
153
+ private parseEntities;
154
+ private parseArchitecture;
155
+ private parseServices;
156
+ private parseKnowledge;
157
+ private mergeSummaries;
158
+ private fallbackDiscovery;
159
+ private createEmptyResult;
160
+ private log;
161
+ private delay;
162
+ }
163
+
164
+ type FileCategory = "entry" | "model" | "service" | "util" | "config" | "test" | "other";
165
+ interface CollectedFile {
166
+ path: string;
167
+ absolutePath: string;
168
+ language: string;
169
+ category: FileCategory;
170
+ size: number;
171
+ priority: number;
172
+ }
173
+ interface CollectionResult {
174
+ files: CollectedFile[];
175
+ languages: string[];
176
+ projectType: string;
177
+ totalFilesScanned: number;
178
+ }
179
+ interface CollectOptions {
180
+ maxFiles?: number;
181
+ excludePatterns?: string[];
182
+ priorityPatterns?: string[];
183
+ supportedLanguages?: string[];
184
+ }
185
+ declare class FileCollector {
186
+ private projectPath;
187
+ constructor(projectPath: string);
188
+ collect(options?: CollectOptions): Promise<CollectionResult>;
189
+ detectLanguages(): Promise<{
190
+ languages: string[];
191
+ projectType: string;
192
+ }>;
193
+ private loadIgnorePatterns;
194
+ private shouldIgnore;
195
+ private matchPattern;
196
+ private categorizeFile;
197
+ private calculatePriority;
198
+ private walkDirectory;
199
+ }
200
+
201
+ interface FileChunk {
202
+ files: CollectedFile[];
203
+ content: string;
204
+ estimatedTokens: number;
205
+ index: number;
206
+ totalChunks: number;
207
+ }
208
+ interface ChunkOptions {
209
+ maxChunkSize?: number;
210
+ }
211
+ declare class ChunkManager {
212
+ private files;
213
+ private maxChunkSize;
214
+ private chunks;
215
+ constructor(files: CollectedFile[], options?: ChunkOptions);
216
+ prepareChunks(): Promise<FileChunk[]>;
217
+ private createChunk;
218
+ private formatFileContent;
219
+ private truncateContent;
220
+ getTotalChunks(): number;
221
+ getChunkSummary(): string;
222
+ iterateChunks(): AsyncGenerator<FileChunk>;
223
+ }
224
+
128
225
  interface CCKBConfig {
129
226
  compaction: {
130
227
  trigger: "session_end" | "size" | "messages" | "manual";
@@ -144,6 +241,13 @@ interface CCKBConfig {
144
241
  enabled: boolean;
145
242
  contextDepth: number;
146
243
  };
244
+ discover: {
245
+ maxFiles: number;
246
+ maxChunkSize: number;
247
+ excludePatterns: string[];
248
+ priorityPatterns: string[];
249
+ supportedLanguages: string[];
250
+ };
147
251
  }
148
252
 
149
- export { type CCKBConfig, CompactionEngine, ConversationManager, EntityDetector, IndexManager, VaultIntegrator, install };
253
+ export { AutoDiscover, type CCKBConfig, ChunkManager, CompactionEngine, ConversationManager, EntityDetector, FileCollector, IndexManager, VaultIntegrator, discover, install };
package/dist/index.js CHANGED
@@ -1,24 +1,34 @@
1
1
  import {
2
+ AutoDiscover,
3
+ ChunkManager,
4
+ FileCollector,
5
+ discover,
2
6
  install
3
- } from "./chunk-3KGJEBKK.js";
7
+ } from "./chunk-P7O44DI3.js";
8
+ import {
9
+ CompactionEngine
10
+ } from "./chunk-EPZCT4Y2.js";
4
11
  import {
5
- CompactionEngine,
6
12
  EntityDetector,
7
13
  VaultIntegrator
8
- } from "./chunk-GLYS4OA4.js";
14
+ } from "./chunk-ZZDG5UWP.js";
9
15
  import {
10
16
  ConversationManager
11
- } from "./chunk-XQXIDTUW.js";
17
+ } from "./chunk-HP5YVMZ6.js";
12
18
  import {
13
19
  IndexManager
14
- } from "./chunk-NOCXYKIE.js";
15
- import "./chunk-E2IJSPVB.js";
20
+ } from "./chunk-4IQV2TQE.js";
21
+ import "./chunk-FRETJBP5.js";
16
22
  export {
23
+ AutoDiscover,
24
+ ChunkManager,
17
25
  CompactionEngine,
18
26
  ConversationManager,
19
27
  EntityDetector,
28
+ FileCollector,
20
29
  IndexManager,
21
30
  VaultIntegrator,
31
+ discover,
22
32
  install
23
33
  };
24
34
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cckb",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Claude Code Knowledge Base - Automatic project knowledge capture for Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,207 +0,0 @@
1
- import {
2
- DEFAULT_CONFIG,
3
- ensureDir,
4
- fileExists,
5
- readJSON,
6
- readTextFile,
7
- writeJSON,
8
- writeTextFile
9
- } from "./chunk-E2IJSPVB.js";
10
-
11
- // src/cli/install.ts
12
- import * as fs from "fs/promises";
13
- import * as fsSync from "fs";
14
- import * as path from "path";
15
- import { fileURLToPath } from "url";
16
- var __dirname = path.dirname(fileURLToPath(import.meta.url));
17
- function findPackageRoot() {
18
- let dir = __dirname;
19
- for (let i = 0; i < 5; i++) {
20
- const packageJson = path.join(dir, "package.json");
21
- if (fsSync.existsSync(packageJson)) {
22
- return dir;
23
- }
24
- dir = path.dirname(dir);
25
- }
26
- return path.resolve(__dirname, "../..");
27
- }
28
- var PACKAGE_ROOT = findPackageRoot();
29
- var TEMPLATES_DIR = path.join(PACKAGE_ROOT, "templates");
30
- async function install(targetPath, options = {}) {
31
- const resolvedPath = path.resolve(targetPath);
32
- console.log(`Installing CCKB to: ${resolvedPath}`);
33
- await validateTargetPath(resolvedPath);
34
- await checkExistingInstallation(resolvedPath, options.force);
35
- await createDirectoryStructure(resolvedPath);
36
- await copyTemplateFiles(resolvedPath);
37
- await createConfigFile(resolvedPath);
38
- await installHooks(resolvedPath);
39
- await updateClaudeMd(resolvedPath);
40
- await updateGitignore(resolvedPath);
41
- console.log("\nCCKB installed successfully!");
42
- console.log("\nNext steps:");
43
- console.log(" 1. Review cc-knowledge-base/vault/ structure");
44
- console.log(" 2. Check .claude/settings.json for hook configuration");
45
- console.log(" 3. Start a new Claude Code session to begin capturing knowledge");
46
- }
47
- async function validateTargetPath(targetPath) {
48
- const exists = await fileExists(targetPath);
49
- if (!exists) {
50
- throw new Error(`Target path does not exist: ${targetPath}`);
51
- }
52
- const stats = await fs.stat(targetPath);
53
- if (!stats.isDirectory()) {
54
- throw new Error(`Target path is not a directory: ${targetPath}`);
55
- }
56
- }
57
- async function checkExistingInstallation(targetPath, force) {
58
- const kbPath = path.join(targetPath, "cc-knowledge-base");
59
- const exists = await fileExists(kbPath);
60
- if (exists && !force) {
61
- throw new Error(
62
- "CCKB is already installed in this project. Use --force to reinstall."
63
- );
64
- }
65
- }
66
- async function createDirectoryStructure(targetPath) {
67
- const directories = [
68
- "cc-knowledge-base",
69
- "cc-knowledge-base/conversations",
70
- "cc-knowledge-base/vault",
71
- "cc-knowledge-base/vault/entities",
72
- "cc-knowledge-base/vault/apps",
73
- "cc-knowledge-base/vault/modules",
74
- "cc-knowledge-base/.cckb-state"
75
- ];
76
- for (const dir of directories) {
77
- await ensureDir(path.join(targetPath, dir));
78
- }
79
- console.log(" Created directory structure");
80
- }
81
- async function copyTemplateFiles(targetPath) {
82
- const vaultFiles = [
83
- { src: "vault/INDEX.md", dest: "cc-knowledge-base/vault/INDEX.md" },
84
- {
85
- src: "vault/architecture.md",
86
- dest: "cc-knowledge-base/vault/architecture.md"
87
- },
88
- {
89
- src: "vault/general-knowledge.md",
90
- dest: "cc-knowledge-base/vault/general-knowledge.md"
91
- },
92
- {
93
- src: "vault/entities/INDEX.md",
94
- dest: "cc-knowledge-base/vault/entities/INDEX.md"
95
- },
96
- {
97
- src: "vault/apps/INDEX.md",
98
- dest: "cc-knowledge-base/vault/apps/INDEX.md"
99
- },
100
- {
101
- src: "vault/modules/INDEX.md",
102
- dest: "cc-knowledge-base/vault/modules/INDEX.md"
103
- }
104
- ];
105
- for (const file of vaultFiles) {
106
- const srcPath = path.join(TEMPLATES_DIR, file.src);
107
- const destPath = path.join(targetPath, file.dest);
108
- const content = await readTextFile(srcPath);
109
- if (content) {
110
- await writeTextFile(destPath, content);
111
- }
112
- }
113
- await writeTextFile(
114
- path.join(targetPath, "cc-knowledge-base/conversations/.gitkeep"),
115
- ""
116
- );
117
- console.log(" Copied vault template files");
118
- }
119
- async function createConfigFile(targetPath) {
120
- const configPath = path.join(
121
- targetPath,
122
- "cc-knowledge-base",
123
- ".cckb-config.json"
124
- );
125
- await writeJSON(configPath, DEFAULT_CONFIG);
126
- console.log(" Created configuration file");
127
- }
128
- async function installHooks(targetPath) {
129
- const claudeDir = path.join(targetPath, ".claude");
130
- const settingsPath = path.join(claudeDir, "settings.json");
131
- await ensureDir(claudeDir);
132
- let settings = await readJSON(settingsPath) || {};
133
- const templatePath = path.join(TEMPLATES_DIR, "settings.json.tmpl");
134
- const hookSettings = await readJSON(
135
- templatePath
136
- );
137
- if (!hookSettings) {
138
- throw new Error("Failed to load hook template");
139
- }
140
- const existingHooks = settings.hooks || {};
141
- const newHooks = hookSettings.hooks;
142
- settings.hooks = mergeHooks(existingHooks, newHooks);
143
- await writeJSON(settingsPath, settings);
144
- console.log(" Installed hook configuration");
145
- }
146
- function mergeHooks(existing, incoming) {
147
- const merged = { ...existing };
148
- for (const [hookType, hooks] of Object.entries(incoming)) {
149
- if (!merged[hookType]) {
150
- merged[hookType] = [];
151
- }
152
- for (const hook of hooks) {
153
- const hookObj = hook;
154
- const command = hookObj.command;
155
- if (command?.includes("cckb")) {
156
- merged[hookType] = merged[hookType].filter((h) => {
157
- const existingCmd = h.command;
158
- return !existingCmd?.includes("cckb");
159
- });
160
- }
161
- merged[hookType].push(hook);
162
- }
163
- }
164
- return merged;
165
- }
166
- async function updateClaudeMd(targetPath) {
167
- const claudeMdPath = path.join(targetPath, "CLAUDE.md");
168
- const templatePath = path.join(TEMPLATES_DIR, "CLAUDE.md.tmpl");
169
- const template = await readTextFile(templatePath);
170
- if (!template) {
171
- throw new Error("Failed to load CLAUDE.md template");
172
- }
173
- const marker = "## Project Knowledge Base (CCKB)";
174
- let existing = await readTextFile(claudeMdPath);
175
- if (existing) {
176
- if (existing.includes(marker)) {
177
- const regex = /## Project Knowledge Base \(CCKB\)[\s\S]*?(?=\n## |$)/;
178
- existing = existing.replace(regex, template.trim());
179
- } else {
180
- existing = existing.trimEnd() + "\n\n" + template;
181
- }
182
- await writeTextFile(claudeMdPath, existing);
183
- } else {
184
- await writeTextFile(claudeMdPath, template);
185
- }
186
- console.log(" Updated CLAUDE.md with vault directives");
187
- }
188
- async function updateGitignore(targetPath) {
189
- const gitignorePath = path.join(targetPath, ".gitignore");
190
- const entries = [
191
- "",
192
- "# CCKB state files",
193
- "cc-knowledge-base/.cckb-state/"
194
- ];
195
- let existing = await readTextFile(gitignorePath) || "";
196
- if (existing.includes("cc-knowledge-base/.cckb-state/")) {
197
- return;
198
- }
199
- existing = existing.trimEnd() + "\n" + entries.join("\n") + "\n";
200
- await writeTextFile(gitignorePath, existing);
201
- console.log(" Updated .gitignore");
202
- }
203
-
204
- export {
205
- install
206
- };
207
- //# sourceMappingURL=chunk-3KGJEBKK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/install.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ensureDir,\n fileExists,\n readJSON,\n writeJSON,\n readTextFile,\n writeTextFile,\n} from \"../utils/file-utils.js\";\nimport { DEFAULT_CONFIG } from \"../utils/config.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Find package root by looking for package.json\nfunction findPackageRoot(): string {\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const packageJson = path.join(dir, \"package.json\");\n if (fsSync.existsSync(packageJson)) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n // Fallback to relative from __dirname\n return path.resolve(__dirname, \"../..\");\n}\n\nconst PACKAGE_ROOT = findPackageRoot();\nconst TEMPLATES_DIR = path.join(PACKAGE_ROOT, \"templates\");\n\nexport interface InstallOptions {\n force?: boolean;\n}\n\nexport async function install(\n targetPath: string,\n options: InstallOptions = {}\n): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n\n console.log(`Installing CCKB to: ${resolvedPath}`);\n\n // Pre-flight checks\n await validateTargetPath(resolvedPath);\n await checkExistingInstallation(resolvedPath, options.force);\n\n // Create directory structure\n await createDirectoryStructure(resolvedPath);\n\n // Copy template files\n await copyTemplateFiles(resolvedPath);\n\n // Create config file\n await createConfigFile(resolvedPath);\n\n // Install hooks configuration\n await installHooks(resolvedPath);\n\n // Update CLAUDE.md\n await updateClaudeMd(resolvedPath);\n\n // Update .gitignore\n await updateGitignore(resolvedPath);\n\n console.log(\"\\nCCKB installed successfully!\");\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Review cc-knowledge-base/vault/ structure\");\n console.log(\" 2. Check .claude/settings.json for hook configuration\");\n console.log(\" 3. Start a new Claude Code session to begin capturing knowledge\");\n}\n\nasync function validateTargetPath(targetPath: string): Promise<void> {\n const exists = await fileExists(targetPath);\n if (!exists) {\n throw new Error(`Target path does not exist: ${targetPath}`);\n }\n\n const stats = await fs.stat(targetPath);\n if (!stats.isDirectory()) {\n throw new Error(`Target path is not a directory: ${targetPath}`);\n }\n}\n\nasync function checkExistingInstallation(\n targetPath: string,\n force?: boolean\n): Promise<void> {\n const kbPath = path.join(targetPath, \"cc-knowledge-base\");\n const exists = await fileExists(kbPath);\n\n if (exists && !force) {\n throw new Error(\n \"CCKB is already installed in this project. Use --force to reinstall.\"\n );\n }\n}\n\nasync function createDirectoryStructure(targetPath: string): Promise<void> {\n const directories = [\n \"cc-knowledge-base\",\n \"cc-knowledge-base/conversations\",\n \"cc-knowledge-base/vault\",\n \"cc-knowledge-base/vault/entities\",\n \"cc-knowledge-base/vault/apps\",\n \"cc-knowledge-base/vault/modules\",\n \"cc-knowledge-base/.cckb-state\",\n ];\n\n for (const dir of directories) {\n await ensureDir(path.join(targetPath, dir));\n }\n\n console.log(\" Created directory structure\");\n}\n\nasync function copyTemplateFiles(targetPath: string): Promise<void> {\n const vaultFiles = [\n { src: \"vault/INDEX.md\", dest: \"cc-knowledge-base/vault/INDEX.md\" },\n {\n src: \"vault/architecture.md\",\n dest: \"cc-knowledge-base/vault/architecture.md\",\n },\n {\n src: \"vault/general-knowledge.md\",\n dest: \"cc-knowledge-base/vault/general-knowledge.md\",\n },\n {\n src: \"vault/entities/INDEX.md\",\n dest: \"cc-knowledge-base/vault/entities/INDEX.md\",\n },\n {\n src: \"vault/apps/INDEX.md\",\n dest: \"cc-knowledge-base/vault/apps/INDEX.md\",\n },\n {\n src: \"vault/modules/INDEX.md\",\n dest: \"cc-knowledge-base/vault/modules/INDEX.md\",\n },\n ];\n\n for (const file of vaultFiles) {\n const srcPath = path.join(TEMPLATES_DIR, file.src);\n const destPath = path.join(targetPath, file.dest);\n\n const content = await readTextFile(srcPath);\n if (content) {\n await writeTextFile(destPath, content);\n }\n }\n\n // Create .gitkeep for conversations\n await writeTextFile(\n path.join(targetPath, \"cc-knowledge-base/conversations/.gitkeep\"),\n \"\"\n );\n\n console.log(\" Copied vault template files\");\n}\n\nasync function createConfigFile(targetPath: string): Promise<void> {\n const configPath = path.join(\n targetPath,\n \"cc-knowledge-base\",\n \".cckb-config.json\"\n );\n\n await writeJSON(configPath, DEFAULT_CONFIG);\n\n console.log(\" Created configuration file\");\n}\n\nasync function installHooks(targetPath: string): Promise<void> {\n const claudeDir = path.join(targetPath, \".claude\");\n const settingsPath = path.join(claudeDir, \"settings.json\");\n\n await ensureDir(claudeDir);\n\n // Load existing settings or create new\n let settings: Record<string, unknown> =\n (await readJSON<Record<string, unknown>>(settingsPath)) || {};\n\n // Load hook template\n const templatePath = path.join(TEMPLATES_DIR, \"settings.json.tmpl\");\n const hookSettings = await readJSON<{ hooks: Record<string, unknown> }>(\n templatePath\n );\n\n if (!hookSettings) {\n throw new Error(\"Failed to load hook template\");\n }\n\n // Merge hooks (CCKB hooks take precedence for its own hook types)\n const existingHooks = (settings.hooks as Record<string, unknown[]>) || {};\n const newHooks = hookSettings.hooks as Record<string, unknown[]>;\n\n settings.hooks = mergeHooks(existingHooks, newHooks);\n\n await writeJSON(settingsPath, settings);\n\n console.log(\" Installed hook configuration\");\n}\n\nfunction mergeHooks(\n existing: Record<string, unknown[]>,\n incoming: Record<string, unknown[]>\n): Record<string, unknown[]> {\n const merged = { ...existing };\n\n for (const [hookType, hooks] of Object.entries(incoming)) {\n if (!merged[hookType]) {\n merged[hookType] = [];\n }\n\n // Add incoming hooks, avoiding duplicates based on command\n for (const hook of hooks) {\n const hookObj = hook as Record<string, unknown>;\n const command = hookObj.command as string | undefined;\n\n if (command?.includes(\"cckb\")) {\n // Remove any existing CCKB hooks for this type\n merged[hookType] = merged[hookType].filter((h) => {\n const existingCmd = (h as Record<string, unknown>).command as\n | string\n | undefined;\n return !existingCmd?.includes(\"cckb\");\n });\n }\n\n merged[hookType].push(hook);\n }\n }\n\n return merged;\n}\n\nasync function updateClaudeMd(targetPath: string): Promise<void> {\n const claudeMdPath = path.join(targetPath, \"CLAUDE.md\");\n const templatePath = path.join(TEMPLATES_DIR, \"CLAUDE.md.tmpl\");\n\n const template = await readTextFile(templatePath);\n if (!template) {\n throw new Error(\"Failed to load CLAUDE.md template\");\n }\n\n const marker = \"## Project Knowledge Base (CCKB)\";\n\n let existing = await readTextFile(claudeMdPath);\n\n if (existing) {\n // Check if CCKB section already exists\n if (existing.includes(marker)) {\n // Replace existing CCKB section\n const regex = /## Project Knowledge Base \\(CCKB\\)[\\s\\S]*?(?=\\n## |$)/;\n existing = existing.replace(regex, template.trim());\n } else {\n // Append CCKB section\n existing = existing.trimEnd() + \"\\n\\n\" + template;\n }\n await writeTextFile(claudeMdPath, existing);\n } else {\n // Create new CLAUDE.md with CCKB section\n await writeTextFile(claudeMdPath, template);\n }\n\n console.log(\" Updated CLAUDE.md with vault directives\");\n}\n\nasync function updateGitignore(targetPath: string): Promise<void> {\n const gitignorePath = path.join(targetPath, \".gitignore\");\n\n const entries = [\n \"\",\n \"# CCKB state files\",\n \"cc-knowledge-base/.cckb-state/\",\n ];\n\n let existing = (await readTextFile(gitignorePath)) || \"\";\n\n // Check if already added\n if (existing.includes(\"cc-knowledge-base/.cckb-state/\")) {\n return;\n }\n\n existing = existing.trimEnd() + \"\\n\" + entries.join(\"\\n\") + \"\\n\";\n await writeTextFile(gitignorePath, existing);\n\n console.log(\" Updated .gitignore\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/file-utils.ts","../src/utils/config.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJSON<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport async function writeJSON(\n filePath: string,\n data: unknown,\n pretty = true\n): Promise<void> {\n await ensureDir(path.dirname(filePath));\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n await fs.writeFile(filePath, content);\n}\n\nexport async function appendToFile(\n filePath: string,\n content: string\n): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.appendFile(filePath, content);\n}\n\nexport async function readTextFile(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeTextFile(\n filePath: string,\n content: string\n): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content);\n}\n\nexport async function copyFile(src: string, dest: string): Promise<void> {\n await ensureDir(path.dirname(dest));\n await fs.copyFile(src, dest);\n}\n\nexport async function listDir(dirPath: string): Promise<string[]> {\n try {\n return await fs.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function getFileSize(filePath: string): Promise<number> {\n try {\n const stats = await fs.stat(filePath);\n return stats.size;\n } catch {\n return 0;\n }\n}\n\nexport function generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${timestamp}-${random}`;\n}\n\nexport function getCurrentTimestamp(): string {\n return new Date().toISOString();\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface CCKBConfig {\n compaction: {\n trigger: \"session_end\" | \"size\" | \"messages\" | \"manual\";\n sizeThresholdKB: number;\n messageThreshold: number;\n cleanupAfterSummary: \"keep\" | \"archive\" | \"delete\";\n };\n capture: {\n tools: string[];\n maxContentLength: number;\n };\n vault: {\n autoIntegrate: boolean;\n maxDepth: number;\n };\n feedback: {\n enabled: boolean;\n contextDepth: number;\n };\n}\n\nexport const DEFAULT_CONFIG: CCKBConfig = {\n compaction: {\n trigger: \"session_end\",\n sizeThresholdKB: 50,\n messageThreshold: 100,\n cleanupAfterSummary: \"keep\",\n },\n capture: {\n tools: [\"Write\", \"Edit\", \"MultiEdit\", \"Bash\", \"Task\"],\n maxContentLength: 500,\n },\n vault: {\n autoIntegrate: true,\n maxDepth: 5,\n },\n feedback: {\n enabled: true,\n contextDepth: 2,\n },\n};\n\nexport async function loadConfig(projectPath: string): Promise<CCKBConfig> {\n const configPath = path.join(\n projectPath,\n \"cc-knowledge-base\",\n \".cckb-config.json\"\n );\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const userConfig = JSON.parse(content);\n return { ...DEFAULT_CONFIG, ...userConfig };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function saveConfig(\n projectPath: string,\n config: CCKBConfig\n): Promise<void> {\n const configPath = path.join(\n projectPath,\n \"cc-knowledge-base\",\n \".cckb-config.json\"\n );\n\n await fs.writeFile(configPath, JSON.stringify(config, null, 2));\n}\n\nexport function getKnowledgeBasePath(projectPath: string): string {\n return path.join(projectPath, \"cc-knowledge-base\");\n}\n\nexport function getConversationsPath(projectPath: string): string {\n return path.join(projectPath, \"cc-knowledge-base\", \"conversations\");\n}\n\nexport function getVaultPath(projectPath: string): string {\n return path.join(projectPath, \"cc-knowledge-base\", \"vault\");\n}\n\nexport function getStatePath(projectPath: string): string {\n return path.join(projectPath, \"cc-knowledge-base\", \".cckb-state\");\n}\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEtB,eAAsB,UAAU,SAAgC;AAC9D,QAAS,SAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C;AAEA,eAAsB,WAAW,UAAoC;AACnE,MAAI;AACF,UAAS,UAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,SAAY,UAAqC;AACrE,MAAI;AACF,UAAM,UAAU,MAAS,YAAS,UAAU,OAAO;AACnD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,UACpB,UACA,MACA,SAAS,MACM;AACf,QAAM,UAAe,aAAQ,QAAQ,CAAC;AACtC,QAAM,UAAU,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI;AAC5E,QAAS,aAAU,UAAU,OAAO;AACtC;AAEA,eAAsB,aACpB,UACA,SACe;AACf,QAAM,UAAe,aAAQ,QAAQ,CAAC;AACtC,QAAS,cAAW,UAAU,OAAO;AACvC;AAEA,eAAsB,aAAa,UAA0C;AAC3E,MAAI;AACF,WAAO,MAAS,YAAS,UAAU,OAAO;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cACpB,UACA,SACe;AACf,QAAM,UAAe,aAAQ,QAAQ,CAAC;AACtC,QAAS,aAAU,UAAU,OAAO;AACtC;AAOA,eAAsB,QAAQ,SAAoC;AAChE,MAAI;AACF,WAAO,MAAS,WAAQ,OAAO;AAAA,EACjC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,YAAY,UAAmC;AACnE,MAAI;AACF,UAAM,QAAQ,MAAS,QAAK,QAAQ;AACpC,WAAO,MAAM;AAAA,EACf,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAA4B;AAC1C,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,GAAG,SAAS,IAAI,MAAM;AAC/B;AAEO,SAAS,sBAA8B;AAC5C,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;;;ACzFA,YAAYA,SAAQ;AACpB,YAAYC,WAAU;AAuBf,IAAM,iBAA6B;AAAA,EACxC,YAAY;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACP,OAAO,CAAC,SAAS,QAAQ,aAAa,QAAQ,MAAM;AAAA,IACpD,kBAAkB;AAAA,EACpB;AAAA,EACA,OAAO;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AACF;AAEA,eAAsB,WAAW,aAA0C;AACzE,QAAM,aAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAS,aAAS,YAAY,OAAO;AACrD,UAAM,aAAa,KAAK,MAAM,OAAO;AACrC,WAAO,EAAE,GAAG,gBAAgB,GAAG,WAAW;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAmBO,SAAS,qBAAqB,aAA6B;AAChE,SAAY,WAAK,aAAa,qBAAqB,eAAe;AACpE;AAEO,SAAS,aAAa,aAA6B;AACxD,SAAY,WAAK,aAAa,qBAAqB,OAAO;AAC5D;AAEO,SAAS,aAAa,aAA6B;AACxD,SAAY,WAAK,aAAa,qBAAqB,aAAa;AAClE;","names":["fs","path"]}