@weavelogic/knowledge-graph-agent 0.11.6 → 0.11.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/dist/cli/commands/hooks.d.ts +1 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +161 -20
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/node_modules/@typescript-eslint/types/dist/index.js +1 -1
- package/dist/node_modules/@typescript-eslint/visitor-keys/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoLpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAub5C"}
|
|
@@ -6,6 +6,7 @@ import { join, dirname } from "path";
|
|
|
6
6
|
import { validateProjectRoot } from "../../core/security.js";
|
|
7
7
|
import "../../claude/types.js";
|
|
8
8
|
import { generateHookConfig, processHookEvent, HookCaptureSystem } from "../../claude/hook-capture.js";
|
|
9
|
+
const KG_HOOK_MARKER = "@weavelogic/knowledge-graph-agent";
|
|
9
10
|
function getClaudeSettingsPath(scope) {
|
|
10
11
|
if (scope === "user") {
|
|
11
12
|
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
@@ -30,25 +31,104 @@ function saveSettings(path, settings) {
|
|
|
30
31
|
}
|
|
31
32
|
writeFileSync(path, JSON.stringify(settings, null, 2));
|
|
32
33
|
}
|
|
34
|
+
function isKgHook(entry) {
|
|
35
|
+
if (entry.command?.includes(KG_HOOK_MARKER)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (entry.hooks?.some((h) => h.command?.includes(KG_HOOK_MARKER))) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
function removeKgHooksFromArray(entries) {
|
|
44
|
+
return entries.filter((entry) => !isKgHook(entry));
|
|
45
|
+
}
|
|
46
|
+
function mergeHooksConfig(existingHooks, kgHooks) {
|
|
47
|
+
const merged = {
|
|
48
|
+
UserPromptSubmit: [],
|
|
49
|
+
PreToolUse: [],
|
|
50
|
+
PostToolUse: [],
|
|
51
|
+
Stop: [],
|
|
52
|
+
PreCompact: []
|
|
53
|
+
};
|
|
54
|
+
if (existingHooks) {
|
|
55
|
+
for (const [event, entries] of Object.entries(existingHooks)) {
|
|
56
|
+
if (Array.isArray(entries)) {
|
|
57
|
+
merged[event] = removeKgHooksFromArray(entries);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const [event, entries] of Object.entries(kgHooks)) {
|
|
62
|
+
if (Array.isArray(entries)) {
|
|
63
|
+
merged[event] = [
|
|
64
|
+
...merged[event],
|
|
65
|
+
...entries
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const event of Object.keys(merged)) {
|
|
70
|
+
if (merged[event].length === 0) {
|
|
71
|
+
delete merged[event];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return merged;
|
|
75
|
+
}
|
|
76
|
+
function removeKgHooksOnly(existingHooks) {
|
|
77
|
+
if (!existingHooks) return null;
|
|
78
|
+
const cleaned = {};
|
|
79
|
+
let hasRemainingHooks = false;
|
|
80
|
+
for (const [event, entries] of Object.entries(existingHooks)) {
|
|
81
|
+
if (Array.isArray(entries)) {
|
|
82
|
+
const remaining = removeKgHooksFromArray(entries);
|
|
83
|
+
if (remaining.length > 0) {
|
|
84
|
+
cleaned[event] = remaining;
|
|
85
|
+
hasRemainingHooks = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return hasRemainingHooks ? cleaned : null;
|
|
90
|
+
}
|
|
91
|
+
function hasKgHooks(hooks) {
|
|
92
|
+
if (!hooks) return false;
|
|
93
|
+
for (const entries of Object.values(hooks)) {
|
|
94
|
+
if (Array.isArray(entries) && entries.some(isKgHook)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
33
100
|
function createHooksCommand() {
|
|
34
101
|
const command = new Command("hooks");
|
|
35
102
|
command.description("Claude Code hooks for capturing interactions in the knowledge graph");
|
|
36
|
-
command.command("install").description("Install Claude Code hooks to capture all interactions").option("-p, --path <path>", "Project root path", ".").option("-s, --scope <scope>", "Installation scope: project or user", "project").option("-f, --force", "
|
|
103
|
+
command.command("install").description("Install Claude Code hooks to capture all interactions (merges with existing hooks)").option("-p, --path <path>", "Project root path", ".").option("-s, --scope <scope>", "Installation scope: project or user", "project").option("-f, --force", "Reinstall even if KG hooks already present").option("--replace", "Replace all hooks instead of merging (not recommended)").option("--no-markdown", "Disable markdown document generation").option("--no-tool-outputs", "Disable separate tool output storage").action(async (options) => {
|
|
37
104
|
const spinner = ora("Installing Claude Code hooks...").start();
|
|
38
105
|
try {
|
|
39
106
|
const projectRoot = validateProjectRoot(options.path);
|
|
40
107
|
const settingsPath = getClaudeSettingsPath(options.scope);
|
|
41
108
|
const settings = loadSettings(settingsPath);
|
|
42
|
-
|
|
43
|
-
|
|
109
|
+
const existingHooks = settings.hooks;
|
|
110
|
+
if (hasKgHooks(existingHooks) && !options.force) {
|
|
111
|
+
spinner.info("KG capture hooks already installed.");
|
|
44
112
|
console.log();
|
|
45
|
-
console.log(chalk.gray("
|
|
113
|
+
console.log(chalk.gray(" Use --force to reinstall."));
|
|
114
|
+
console.log(chalk.gray(" Settings:"), chalk.white(settingsPath));
|
|
46
115
|
return;
|
|
47
116
|
}
|
|
48
|
-
const
|
|
117
|
+
const kgHookConfig = generateHookConfig(projectRoot);
|
|
118
|
+
const kgHooks = kgHookConfig.hooks;
|
|
119
|
+
let mergedHooks;
|
|
120
|
+
if (options.replace) {
|
|
121
|
+
mergedHooks = kgHooks;
|
|
122
|
+
spinner.text = "Replacing all hooks with KG capture hooks...";
|
|
123
|
+
} else {
|
|
124
|
+
mergedHooks = mergeHooksConfig(existingHooks, kgHooks);
|
|
125
|
+
if (existingHooks && Object.keys(existingHooks).length > 0) {
|
|
126
|
+
spinner.text = "Merging KG capture hooks with existing hooks...";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
49
129
|
const newSettings = {
|
|
50
130
|
...settings,
|
|
51
|
-
|
|
131
|
+
hooks: mergedHooks
|
|
52
132
|
};
|
|
53
133
|
saveSettings(settingsPath, newSettings);
|
|
54
134
|
const storageDir = join(projectRoot, ".kg", "claude");
|
|
@@ -61,7 +141,15 @@ function createHooksCommand() {
|
|
|
61
141
|
console.log(chalk.gray(" Settings file:"), chalk.white(settingsPath));
|
|
62
142
|
console.log(chalk.gray(" Storage dir:"), chalk.white(storageDir));
|
|
63
143
|
console.log();
|
|
64
|
-
|
|
144
|
+
if (!options.replace && existingHooks && Object.keys(existingHooks).length > 0) {
|
|
145
|
+
const preservedCount = Object.values(existingHooks).flat().filter((e) => !isKgHook(e)).length;
|
|
146
|
+
if (preservedCount > 0) {
|
|
147
|
+
console.log(chalk.cyan(" Compatibility:"));
|
|
148
|
+
console.log(chalk.gray(` - Preserved ${preservedCount} existing hook(s) (e.g., claude-flow)`));
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
console.log(chalk.cyan(" KG Hooks Added:"));
|
|
65
153
|
console.log(chalk.gray(" - UserPromptSubmit: Captures all user prompts"));
|
|
66
154
|
console.log(chalk.gray(" - PreToolUse: Captures tool invocations"));
|
|
67
155
|
console.log(chalk.gray(" - PostToolUse: Captures tool results"));
|
|
@@ -75,18 +163,43 @@ function createHooksCommand() {
|
|
|
75
163
|
process.exit(1);
|
|
76
164
|
}
|
|
77
165
|
});
|
|
78
|
-
command.command("uninstall").description("Remove
|
|
79
|
-
const spinner = ora("Removing
|
|
166
|
+
command.command("uninstall").description("Remove KG capture hooks (preserves other hooks like claude-flow)").option("-s, --scope <scope>", "Installation scope: project or user", "project").option("--all", "Remove ALL hooks, not just KG hooks (use with caution)").action(async (options) => {
|
|
167
|
+
const spinner = ora("Removing KG capture hooks...").start();
|
|
80
168
|
try {
|
|
81
169
|
const settingsPath = getClaudeSettingsPath(options.scope);
|
|
82
170
|
const settings = loadSettings(settingsPath);
|
|
83
|
-
|
|
171
|
+
const existingHooks = settings.hooks;
|
|
172
|
+
if (!existingHooks) {
|
|
84
173
|
spinner.info("No hooks configured.");
|
|
85
174
|
return;
|
|
86
175
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
176
|
+
if (options.all) {
|
|
177
|
+
delete settings.hooks;
|
|
178
|
+
saveSettings(settingsPath, settings);
|
|
179
|
+
spinner.succeed("All hooks removed.");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (!hasKgHooks(existingHooks)) {
|
|
183
|
+
spinner.info("No KG capture hooks found.");
|
|
184
|
+
console.log();
|
|
185
|
+
console.log(chalk.gray(" Other hooks are still configured."));
|
|
186
|
+
console.log(chalk.gray(" Use --all to remove all hooks."));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const remainingHooks = removeKgHooksOnly(existingHooks);
|
|
190
|
+
if (remainingHooks) {
|
|
191
|
+
settings.hooks = remainingHooks;
|
|
192
|
+
saveSettings(settingsPath, settings);
|
|
193
|
+
const preservedCount = Object.values(remainingHooks).flat().length;
|
|
194
|
+
spinner.succeed("KG capture hooks removed.");
|
|
195
|
+
console.log();
|
|
196
|
+
console.log(chalk.gray(` Preserved ${preservedCount} other hook(s) (e.g., claude-flow).`));
|
|
197
|
+
console.log(chalk.gray(" Use --all to remove all hooks."));
|
|
198
|
+
} else {
|
|
199
|
+
delete settings.hooks;
|
|
200
|
+
saveSettings(settingsPath, settings);
|
|
201
|
+
spinner.succeed("KG capture hooks removed (no other hooks remaining).");
|
|
202
|
+
}
|
|
90
203
|
} catch (error) {
|
|
91
204
|
spinner.fail("Failed to remove hooks");
|
|
92
205
|
console.error(chalk.red(String(error)));
|
|
@@ -107,19 +220,47 @@ function createHooksCommand() {
|
|
|
107
220
|
const projectRoot = validateProjectRoot(options.path);
|
|
108
221
|
const settingsPath = getClaudeSettingsPath(options.scope);
|
|
109
222
|
const settings = loadSettings(settingsPath);
|
|
223
|
+
const existingHooks = settings.hooks;
|
|
110
224
|
console.log();
|
|
111
225
|
console.log(chalk.cyan(" Claude Code Hooks Status"));
|
|
112
226
|
console.log();
|
|
113
|
-
if (
|
|
114
|
-
|
|
227
|
+
if (existingHooks) {
|
|
228
|
+
const kgInstalled = hasKgHooks(existingHooks);
|
|
229
|
+
const totalHooks = Object.values(existingHooks).flat().length;
|
|
230
|
+
const kgHookCount = Object.values(existingHooks).flat().filter((e) => isKgHook(e)).length;
|
|
231
|
+
const otherHookCount = totalHooks - kgHookCount;
|
|
232
|
+
console.log(chalk.green(" ✓ Hooks configured"));
|
|
115
233
|
console.log(chalk.gray(" Settings:"), chalk.white(settingsPath));
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
console.log(chalk.gray(`
|
|
234
|
+
console.log();
|
|
235
|
+
if (kgInstalled) {
|
|
236
|
+
console.log(chalk.green(" ✓ KG capture hooks installed"));
|
|
237
|
+
console.log(chalk.gray(` KG hooks: ${kgHookCount} active`));
|
|
238
|
+
} else {
|
|
239
|
+
console.log(chalk.yellow(" ✗ KG capture hooks not installed"));
|
|
240
|
+
console.log(chalk.gray(" Run:"), chalk.white("kg hooks install"));
|
|
241
|
+
}
|
|
242
|
+
if (otherHookCount > 0) {
|
|
243
|
+
console.log(chalk.green(` ✓ Other hooks present (${otherHookCount})`));
|
|
244
|
+
console.log(chalk.gray(" (e.g., claude-flow, custom hooks)"));
|
|
245
|
+
}
|
|
246
|
+
console.log();
|
|
247
|
+
console.log(chalk.gray(" All configured events:"));
|
|
248
|
+
for (const [event, handlers] of Object.entries(existingHooks)) {
|
|
249
|
+
const arr = handlers;
|
|
250
|
+
const kgCount = arr.filter(isKgHook).length;
|
|
251
|
+
const otherCount = arr.length - kgCount;
|
|
252
|
+
let info = "";
|
|
253
|
+
if (kgCount > 0 && otherCount > 0) {
|
|
254
|
+
info = `(${kgCount} KG, ${otherCount} other)`;
|
|
255
|
+
} else if (kgCount > 0) {
|
|
256
|
+
info = "(KG)";
|
|
257
|
+
} else {
|
|
258
|
+
info = "(other)";
|
|
259
|
+
}
|
|
260
|
+
console.log(chalk.gray(` - ${event}:`), chalk.white(`${arr.length} handler(s) ${info}`));
|
|
120
261
|
}
|
|
121
262
|
} else {
|
|
122
|
-
console.log(chalk.yellow(" ✗
|
|
263
|
+
console.log(chalk.yellow(" ✗ No hooks configured"));
|
|
123
264
|
console.log(chalk.gray(" Run:"), chalk.white("kg hooks install"));
|
|
124
265
|
}
|
|
125
266
|
console.log();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../src/cli/commands/hooks.ts"],"sourcesContent":["/**\n * Hooks Command\n *\n * Manage Claude Code hooks for capturing interactions in the knowledge graph.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { validateProjectRoot } from '../../core/security.js';\nimport {\n HookCaptureSystem,\n processHookEvent,\n generateHookConfig,\n type HookEventType,\n} from '../../claude/index.js';\n\n/**\n * Path to Claude settings\n */\nfunction getClaudeSettingsPath(scope: 'project' | 'user'): string {\n if (scope === 'user') {\n const home = process.env.HOME || process.env.USERPROFILE || '';\n return join(home, '.claude', 'settings.json');\n }\n return join(process.cwd(), '.claude', 'settings.json');\n}\n\n/**\n * Load existing settings or return empty object\n */\nfunction loadSettings(path: string): Record<string, unknown> {\n if (!existsSync(path)) {\n return {};\n }\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return {};\n }\n}\n\n/**\n * Save settings to file\n */\nfunction saveSettings(path: string, settings: Record<string, unknown>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(settings, null, 2));\n}\n\n/**\n * Create hooks command\n */\nexport function createHooksCommand(): Command {\n const command = new Command('hooks');\n\n command.description('Claude Code hooks for capturing interactions in the knowledge graph');\n\n // Install hooks\n command\n .command('install')\n .description('Install Claude Code hooks to capture all interactions')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --scope <scope>', 'Installation scope: project or user', 'project')\n .option('-f, --force', 'Overwrite existing hooks configuration')\n .option('--no-markdown', 'Disable markdown document generation')\n .option('--no-tool-outputs', 'Disable separate tool output storage')\n .action(async (options) => {\n const spinner = ora('Installing Claude Code hooks...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const settingsPath = getClaudeSettingsPath(options.scope);\n\n // Load existing settings\n const settings = loadSettings(settingsPath);\n\n // Check for existing hooks\n if (settings.hooks && !options.force) {\n spinner.warn('Hooks already configured. Use --force to overwrite.');\n console.log();\n console.log(chalk.gray(' Current settings:'), chalk.white(settingsPath));\n return;\n }\n\n // Generate hook configuration\n const hookConfig = generateHookConfig(projectRoot);\n\n // Merge with existing settings\n const newSettings = {\n ...settings,\n ...hookConfig,\n };\n\n // Save settings\n saveSettings(settingsPath, newSettings);\n\n // Ensure storage directory exists\n const storageDir = join(projectRoot, '.kg', 'claude');\n if (!existsSync(storageDir)) {\n mkdirSync(storageDir, { recursive: true });\n }\n\n spinner.succeed('Claude Code hooks installed!');\n\n console.log();\n console.log(chalk.cyan(' Hook Configuration'));\n console.log(chalk.gray(' Settings file:'), chalk.white(settingsPath));\n console.log(chalk.gray(' Storage dir:'), chalk.white(storageDir));\n console.log();\n console.log(chalk.cyan(' Hooks Installed:'));\n console.log(chalk.gray(' - UserPromptSubmit: Captures all user prompts'));\n console.log(chalk.gray(' - PreToolUse: Captures tool invocations'));\n console.log(chalk.gray(' - PostToolUse: Captures tool results'));\n console.log(chalk.gray(' - Stop: Finalizes session on completion'));\n console.log();\n console.log(chalk.green(' All Claude interactions will now be stored in the knowledge graph.'));\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to install hooks');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Uninstall hooks\n command\n .command('uninstall')\n .description('Remove Claude Code hooks')\n .option('-s, --scope <scope>', 'Installation scope: project or user', 'project')\n .action(async (options) => {\n const spinner = ora('Removing Claude Code hooks...').start();\n\n try {\n const settingsPath = getClaudeSettingsPath(options.scope);\n const settings = loadSettings(settingsPath);\n\n if (!settings.hooks) {\n spinner.info('No hooks configured.');\n return;\n }\n\n // Remove hooks configuration\n delete settings.hooks;\n saveSettings(settingsPath, settings);\n\n spinner.succeed('Claude Code hooks removed.');\n\n } catch (error) {\n spinner.fail('Failed to remove hooks');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Capture event (used by hooks)\n command\n .command('capture')\n .description('Capture a hook event (internal use)')\n .option('-e, --event <type>', 'Event type', 'UserPromptSubmit')\n .option('-p, --path <path>', 'Project root path', '.')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const eventType = options.event as HookEventType;\n\n await processHookEvent(projectRoot, eventType);\n\n } catch (error) {\n // Silent failure - hooks should not disrupt Claude Code operation\n console.error(`Hook capture error: ${error}`);\n }\n });\n\n // Status command\n command\n .command('status')\n .description('Show hooks status and recent captures')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --scope <scope>', 'Check scope: project or user', 'project')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const settingsPath = getClaudeSettingsPath(options.scope);\n const settings = loadSettings(settingsPath);\n\n console.log();\n console.log(chalk.cyan(' Claude Code Hooks Status'));\n console.log();\n\n // Check installation\n if (settings.hooks) {\n console.log(chalk.green(' ✓ Hooks installed'));\n console.log(chalk.gray(' Settings:'), chalk.white(settingsPath));\n\n const hooks = settings.hooks as Record<string, unknown[]>;\n console.log(chalk.gray(' Configured hooks:'));\n for (const [event, handlers] of Object.entries(hooks)) {\n console.log(chalk.gray(` - ${event}:`), chalk.white(`${(handlers as unknown[]).length} handler(s)`));\n }\n } else {\n console.log(chalk.yellow(' ✗ Hooks not installed'));\n console.log(chalk.gray(' Run:'), chalk.white('kg hooks install'));\n }\n\n console.log();\n\n // Check storage\n const storageDir = join(projectRoot, '.kg', 'claude');\n if (existsSync(storageDir)) {\n console.log(chalk.green(' ✓ Storage directory exists'));\n console.log(chalk.gray(' Path:'), chalk.white(storageDir));\n\n // List sessions\n const capture = new HookCaptureSystem(projectRoot);\n const sessions = capture.listSessions();\n\n if (sessions.length > 0) {\n console.log(chalk.gray(' Sessions:'), chalk.white(`${sessions.length} stored`));\n\n // Show recent sessions\n const recent = sessions.slice(-3);\n for (const sessionId of recent) {\n const session = capture.loadSession(sessionId);\n if (session) {\n console.log(\n chalk.gray(` - ${sessionId}:`),\n chalk.white(session.name),\n chalk.gray(`(${session.status})`)\n );\n }\n }\n } else {\n console.log(chalk.gray(' Sessions:'), chalk.white('None yet'));\n }\n } else {\n console.log(chalk.yellow(' ✗ Storage directory not found'));\n console.log(chalk.gray(' Will be created on first capture'));\n }\n\n console.log();\n\n } catch (error) {\n console.error(chalk.red('Failed to get status:'), String(error));\n process.exit(1);\n }\n });\n\n // List sessions\n command\n .command('sessions')\n .description('List captured sessions')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-l, --limit <number>', 'Limit number of sessions', '10')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const limit = parseInt(options.limit, 10);\n\n const capture = new HookCaptureSystem(projectRoot);\n const sessions = capture.listSessions();\n\n if (options.json) {\n const sessionData = sessions.slice(-limit).map(id => capture.loadSession(id));\n console.log(JSON.stringify(sessionData, null, 2));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(' Captured Sessions'));\n console.log();\n\n if (sessions.length === 0) {\n console.log(chalk.gray(' No sessions captured yet.'));\n console.log();\n return;\n }\n\n const recentSessions = sessions.slice(-limit);\n for (const sessionId of recentSessions) {\n const session = capture.loadSession(sessionId);\n if (session) {\n const statusColor = session.status === 'completed' ? chalk.green : chalk.yellow;\n console.log(\n chalk.white(` ${session.id}`),\n chalk.gray('|'),\n chalk.cyan(session.name)\n );\n console.log(\n chalk.gray(' Status:'),\n statusColor(session.status),\n chalk.gray('|'),\n chalk.gray('Conversations:'),\n chalk.white(String(session.conversationIds.length)),\n chalk.gray('|'),\n chalk.gray('Tokens:'),\n chalk.white(String(session.tokenUsage.totalTokens))\n );\n console.log(\n chalk.gray(' Started:'),\n chalk.white(new Date(session.startedAt).toLocaleString())\n );\n console.log();\n }\n }\n\n if (sessions.length > limit) {\n console.log(chalk.gray(` ... and ${sessions.length - limit} more sessions`));\n console.log();\n }\n\n } catch (error) {\n console.error(chalk.red('Failed to list sessions:'), String(error));\n process.exit(1);\n }\n });\n\n // Export sessions\n command\n .command('export')\n .description('Export captured sessions')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-o, --output <file>', 'Output file path')\n .option('-f, --format <format>', 'Output format: json or markdown', 'json')\n .option('--session <id>', 'Export specific session')\n .action(async (options) => {\n const spinner = ora('Exporting sessions...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const capture = new HookCaptureSystem(projectRoot);\n\n let sessionsToExport: string[];\n\n if (options.session) {\n sessionsToExport = [options.session];\n } else {\n sessionsToExport = capture.listSessions();\n }\n\n if (sessionsToExport.length === 0) {\n spinner.info('No sessions to export.');\n return;\n }\n\n const exportData = sessionsToExport\n .map(id => capture.loadSession(id as any))\n .filter(Boolean);\n\n if (options.format === 'json') {\n const output = JSON.stringify(exportData, null, 2);\n\n if (options.output) {\n writeFileSync(options.output, output);\n spinner.succeed(`Exported ${exportData.length} session(s) to ${options.output}`);\n } else {\n spinner.stop();\n console.log(output);\n }\n } else if (options.format === 'markdown') {\n let markdown = '# Claude Interaction Sessions\\n\\n';\n\n for (const session of exportData) {\n if (!session) continue;\n markdown += `## ${session.name}\\n\\n`;\n markdown += `- **ID:** ${session.id}\\n`;\n markdown += `- **Status:** ${session.status}\\n`;\n markdown += `- **Purpose:** ${session.purpose || 'N/A'}\\n`;\n markdown += `- **Started:** ${new Date(session.startedAt).toISOString()}\\n`;\n if (session.endedAt) {\n markdown += `- **Ended:** ${new Date(session.endedAt).toISOString()}\\n`;\n }\n markdown += `- **Conversations:** ${session.conversationIds.length}\\n`;\n markdown += `- **Tokens:** ${session.tokenUsage.totalTokens}\\n\\n`;\n }\n\n if (options.output) {\n writeFileSync(options.output, markdown);\n spinner.succeed(`Exported ${exportData.length} session(s) to ${options.output}`);\n } else {\n spinner.stop();\n console.log(markdown);\n }\n }\n\n } catch (error) {\n spinner.fail('Failed to export sessions');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../src/cli/commands/hooks.ts"],"sourcesContent":["/**\n * Hooks Command\n *\n * Manage Claude Code hooks for capturing interactions in the knowledge graph.\n * Supports merging with existing hooks (e.g., claude-flow) for compatibility.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { validateProjectRoot } from '../../core/security.js';\nimport {\n HookCaptureSystem,\n processHookEvent,\n generateHookConfig,\n type HookEventType,\n} from '../../claude/index.js';\n\n/** KG hook identifier to track which hooks belong to us */\nconst KG_HOOK_MARKER = '@weavelogic/knowledge-graph-agent';\n\n/** Hook event types we support */\ntype HookEventName = 'UserPromptSubmit' | 'PreToolUse' | 'PostToolUse' | 'Stop' | 'PreCompact';\n\n/** Single hook handler configuration */\ninterface HookHandler {\n type: 'command';\n command: string;\n timeout?: number;\n}\n\n/** Hook entry can be nested (with hooks array) or flat (direct command) */\ninterface HookEntry {\n matcher?: string;\n hooks?: HookHandler[];\n // Flat format fields\n type?: 'command';\n command?: string;\n timeout?: number;\n}\n\n/** Full hooks configuration */\ntype HooksConfig = Record<HookEventName, HookEntry[]>;\n\n/**\n * Path to Claude settings\n */\nfunction getClaudeSettingsPath(scope: 'project' | 'user'): string {\n if (scope === 'user') {\n const home = process.env.HOME || process.env.USERPROFILE || '';\n return join(home, '.claude', 'settings.json');\n }\n return join(process.cwd(), '.claude', 'settings.json');\n}\n\n/**\n * Load existing settings or return empty object\n */\nfunction loadSettings(path: string): Record<string, unknown> {\n if (!existsSync(path)) {\n return {};\n }\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return {};\n }\n}\n\n/**\n * Save settings to file\n */\nfunction saveSettings(path: string, settings: Record<string, unknown>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(settings, null, 2));\n}\n\n/**\n * Check if a hook entry belongs to KG agent\n * Handles both flat format ({ type, command }) and nested format ({ hooks: [...] })\n */\nfunction isKgHook(entry: HookEntry): boolean {\n // Check flat format (entry has command directly)\n if (entry.command?.includes(KG_HOOK_MARKER)) {\n return true;\n }\n // Check nested format (entry has hooks array)\n if (entry.hooks?.some(h => h.command?.includes(KG_HOOK_MARKER))) {\n return true;\n }\n return false;\n}\n\n/**\n * Remove KG hooks from a hooks array while preserving others\n */\nfunction removeKgHooksFromArray(entries: HookEntry[]): HookEntry[] {\n return entries.filter(entry => !isKgHook(entry));\n}\n\n/**\n * Merge KG hooks with existing hooks configuration\n * Preserves all existing hooks and adds KG hooks alongside them\n */\nfunction mergeHooksConfig(\n existingHooks: Partial<HooksConfig> | undefined,\n kgHooks: Partial<HooksConfig>\n): HooksConfig {\n const merged: HooksConfig = {\n UserPromptSubmit: [],\n PreToolUse: [],\n PostToolUse: [],\n Stop: [],\n PreCompact: [],\n };\n\n // First, copy all existing non-KG hooks\n if (existingHooks) {\n for (const [event, entries] of Object.entries(existingHooks)) {\n if (Array.isArray(entries)) {\n merged[event as HookEventName] = removeKgHooksFromArray(entries);\n }\n }\n }\n\n // Then add KG hooks\n for (const [event, entries] of Object.entries(kgHooks)) {\n if (Array.isArray(entries)) {\n merged[event as HookEventName] = [\n ...merged[event as HookEventName],\n ...entries,\n ];\n }\n }\n\n // Remove empty arrays\n for (const event of Object.keys(merged) as HookEventName[]) {\n if (merged[event].length === 0) {\n delete (merged as Record<string, unknown>)[event];\n }\n }\n\n return merged;\n}\n\n/**\n * Remove only KG hooks from existing configuration\n * Preserves all other hooks (e.g., claude-flow)\n */\nfunction removeKgHooksOnly(existingHooks: Partial<HooksConfig> | undefined): Partial<HooksConfig> | null {\n if (!existingHooks) return null;\n\n const cleaned: Partial<HooksConfig> = {};\n let hasRemainingHooks = false;\n\n for (const [event, entries] of Object.entries(existingHooks)) {\n if (Array.isArray(entries)) {\n const remaining = removeKgHooksFromArray(entries);\n if (remaining.length > 0) {\n cleaned[event as HookEventName] = remaining;\n hasRemainingHooks = true;\n }\n }\n }\n\n return hasRemainingHooks ? cleaned : null;\n}\n\n/**\n * Check if KG hooks are already installed\n */\nfunction hasKgHooks(hooks: Partial<HooksConfig> | undefined): boolean {\n if (!hooks) return false;\n\n for (const entries of Object.values(hooks)) {\n if (Array.isArray(entries) && entries.some(isKgHook)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Create hooks command\n */\nexport function createHooksCommand(): Command {\n const command = new Command('hooks');\n\n command.description('Claude Code hooks for capturing interactions in the knowledge graph');\n\n // Install hooks\n command\n .command('install')\n .description('Install Claude Code hooks to capture all interactions (merges with existing hooks)')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --scope <scope>', 'Installation scope: project or user', 'project')\n .option('-f, --force', 'Reinstall even if KG hooks already present')\n .option('--replace', 'Replace all hooks instead of merging (not recommended)')\n .option('--no-markdown', 'Disable markdown document generation')\n .option('--no-tool-outputs', 'Disable separate tool output storage')\n .action(async (options) => {\n const spinner = ora('Installing Claude Code hooks...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const settingsPath = getClaudeSettingsPath(options.scope);\n\n // Load existing settings\n const settings = loadSettings(settingsPath);\n const existingHooks = settings.hooks as Partial<HooksConfig> | undefined;\n\n // Check if KG hooks already installed\n if (hasKgHooks(existingHooks) && !options.force) {\n spinner.info('KG capture hooks already installed.');\n console.log();\n console.log(chalk.gray(' Use --force to reinstall.'));\n console.log(chalk.gray(' Settings:'), chalk.white(settingsPath));\n return;\n }\n\n // Generate KG hook configuration\n const kgHookConfig = generateHookConfig(projectRoot);\n const kgHooks = kgHookConfig.hooks as Partial<HooksConfig>;\n\n let mergedHooks: Partial<HooksConfig>;\n\n if (options.replace) {\n // Replace mode: use only KG hooks\n mergedHooks = kgHooks;\n spinner.text = 'Replacing all hooks with KG capture hooks...';\n } else {\n // Merge mode: preserve existing hooks, add KG hooks\n mergedHooks = mergeHooksConfig(existingHooks, kgHooks);\n if (existingHooks && Object.keys(existingHooks).length > 0) {\n spinner.text = 'Merging KG capture hooks with existing hooks...';\n }\n }\n\n // Update settings with merged hooks\n const newSettings = {\n ...settings,\n hooks: mergedHooks,\n };\n\n // Save settings\n saveSettings(settingsPath, newSettings);\n\n // Ensure storage directory exists\n const storageDir = join(projectRoot, '.kg', 'claude');\n if (!existsSync(storageDir)) {\n mkdirSync(storageDir, { recursive: true });\n }\n\n spinner.succeed('Claude Code hooks installed!');\n\n console.log();\n console.log(chalk.cyan(' Hook Configuration'));\n console.log(chalk.gray(' Settings file:'), chalk.white(settingsPath));\n console.log(chalk.gray(' Storage dir:'), chalk.white(storageDir));\n console.log();\n\n // Show what was preserved\n if (!options.replace && existingHooks && Object.keys(existingHooks).length > 0) {\n const preservedCount = Object.values(existingHooks)\n .flat()\n .filter(e => !isKgHook(e as HookEntry)).length;\n if (preservedCount > 0) {\n console.log(chalk.cyan(' Compatibility:'));\n console.log(chalk.gray(` - Preserved ${preservedCount} existing hook(s) (e.g., claude-flow)`));\n console.log();\n }\n }\n\n console.log(chalk.cyan(' KG Hooks Added:'));\n console.log(chalk.gray(' - UserPromptSubmit: Captures all user prompts'));\n console.log(chalk.gray(' - PreToolUse: Captures tool invocations'));\n console.log(chalk.gray(' - PostToolUse: Captures tool results'));\n console.log(chalk.gray(' - Stop: Finalizes session on completion'));\n console.log();\n console.log(chalk.green(' All Claude interactions will now be stored in the knowledge graph.'));\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to install hooks');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Uninstall hooks\n command\n .command('uninstall')\n .description('Remove KG capture hooks (preserves other hooks like claude-flow)')\n .option('-s, --scope <scope>', 'Installation scope: project or user', 'project')\n .option('--all', 'Remove ALL hooks, not just KG hooks (use with caution)')\n .action(async (options) => {\n const spinner = ora('Removing KG capture hooks...').start();\n\n try {\n const settingsPath = getClaudeSettingsPath(options.scope);\n const settings = loadSettings(settingsPath);\n const existingHooks = settings.hooks as Partial<HooksConfig> | undefined;\n\n if (!existingHooks) {\n spinner.info('No hooks configured.');\n return;\n }\n\n if (options.all) {\n // Remove all hooks\n delete settings.hooks;\n saveSettings(settingsPath, settings);\n spinner.succeed('All hooks removed.');\n return;\n }\n\n // Check if KG hooks are present\n if (!hasKgHooks(existingHooks)) {\n spinner.info('No KG capture hooks found.');\n console.log();\n console.log(chalk.gray(' Other hooks are still configured.'));\n console.log(chalk.gray(' Use --all to remove all hooks.'));\n return;\n }\n\n // Remove only KG hooks, preserve others\n const remainingHooks = removeKgHooksOnly(existingHooks);\n\n if (remainingHooks) {\n settings.hooks = remainingHooks;\n saveSettings(settingsPath, settings);\n\n const preservedCount = Object.values(remainingHooks).flat().length;\n spinner.succeed('KG capture hooks removed.');\n console.log();\n console.log(chalk.gray(` Preserved ${preservedCount} other hook(s) (e.g., claude-flow).`));\n console.log(chalk.gray(' Use --all to remove all hooks.'));\n } else {\n delete settings.hooks;\n saveSettings(settingsPath, settings);\n spinner.succeed('KG capture hooks removed (no other hooks remaining).');\n }\n\n } catch (error) {\n spinner.fail('Failed to remove hooks');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Capture event (used by hooks)\n command\n .command('capture')\n .description('Capture a hook event (internal use)')\n .option('-e, --event <type>', 'Event type', 'UserPromptSubmit')\n .option('-p, --path <path>', 'Project root path', '.')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const eventType = options.event as HookEventType;\n\n await processHookEvent(projectRoot, eventType);\n\n } catch (error) {\n // Silent failure - hooks should not disrupt Claude Code operation\n console.error(`Hook capture error: ${error}`);\n }\n });\n\n // Status command\n command\n .command('status')\n .description('Show hooks status and recent captures')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-s, --scope <scope>', 'Check scope: project or user', 'project')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const settingsPath = getClaudeSettingsPath(options.scope);\n const settings = loadSettings(settingsPath);\n const existingHooks = settings.hooks as Partial<HooksConfig> | undefined;\n\n console.log();\n console.log(chalk.cyan(' Claude Code Hooks Status'));\n console.log();\n\n // Check installation\n if (existingHooks) {\n const kgInstalled = hasKgHooks(existingHooks);\n const totalHooks = Object.values(existingHooks).flat().length;\n const kgHookCount = Object.values(existingHooks)\n .flat()\n .filter(e => isKgHook(e as HookEntry)).length;\n const otherHookCount = totalHooks - kgHookCount;\n\n console.log(chalk.green(' ✓ Hooks configured'));\n console.log(chalk.gray(' Settings:'), chalk.white(settingsPath));\n console.log();\n\n // KG hooks status\n if (kgInstalled) {\n console.log(chalk.green(' ✓ KG capture hooks installed'));\n console.log(chalk.gray(` KG hooks: ${kgHookCount} active`));\n } else {\n console.log(chalk.yellow(' ✗ KG capture hooks not installed'));\n console.log(chalk.gray(' Run:'), chalk.white('kg hooks install'));\n }\n\n // Other hooks status\n if (otherHookCount > 0) {\n console.log(chalk.green(` ✓ Other hooks present (${otherHookCount})`));\n console.log(chalk.gray(' (e.g., claude-flow, custom hooks)'));\n }\n\n console.log();\n console.log(chalk.gray(' All configured events:'));\n for (const [event, handlers] of Object.entries(existingHooks)) {\n const arr = handlers as HookEntry[];\n const kgCount = arr.filter(isKgHook).length;\n const otherCount = arr.length - kgCount;\n let info = '';\n if (kgCount > 0 && otherCount > 0) {\n info = `(${kgCount} KG, ${otherCount} other)`;\n } else if (kgCount > 0) {\n info = '(KG)';\n } else {\n info = '(other)';\n }\n console.log(chalk.gray(` - ${event}:`), chalk.white(`${arr.length} handler(s) ${info}`));\n }\n } else {\n console.log(chalk.yellow(' ✗ No hooks configured'));\n console.log(chalk.gray(' Run:'), chalk.white('kg hooks install'));\n }\n\n console.log();\n\n // Check storage\n const storageDir = join(projectRoot, '.kg', 'claude');\n if (existsSync(storageDir)) {\n console.log(chalk.green(' ✓ Storage directory exists'));\n console.log(chalk.gray(' Path:'), chalk.white(storageDir));\n\n // List sessions\n const capture = new HookCaptureSystem(projectRoot);\n const sessions = capture.listSessions();\n\n if (sessions.length > 0) {\n console.log(chalk.gray(' Sessions:'), chalk.white(`${sessions.length} stored`));\n\n // Show recent sessions\n const recent = sessions.slice(-3);\n for (const sessionId of recent) {\n const session = capture.loadSession(sessionId);\n if (session) {\n console.log(\n chalk.gray(` - ${sessionId}:`),\n chalk.white(session.name),\n chalk.gray(`(${session.status})`)\n );\n }\n }\n } else {\n console.log(chalk.gray(' Sessions:'), chalk.white('None yet'));\n }\n } else {\n console.log(chalk.yellow(' ✗ Storage directory not found'));\n console.log(chalk.gray(' Will be created on first capture'));\n }\n\n console.log();\n\n } catch (error) {\n console.error(chalk.red('Failed to get status:'), String(error));\n process.exit(1);\n }\n });\n\n // List sessions\n command\n .command('sessions')\n .description('List captured sessions')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-l, --limit <number>', 'Limit number of sessions', '10')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const projectRoot = validateProjectRoot(options.path);\n const limit = parseInt(options.limit, 10);\n\n const capture = new HookCaptureSystem(projectRoot);\n const sessions = capture.listSessions();\n\n if (options.json) {\n const sessionData = sessions.slice(-limit).map(id => capture.loadSession(id));\n console.log(JSON.stringify(sessionData, null, 2));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(' Captured Sessions'));\n console.log();\n\n if (sessions.length === 0) {\n console.log(chalk.gray(' No sessions captured yet.'));\n console.log();\n return;\n }\n\n const recentSessions = sessions.slice(-limit);\n for (const sessionId of recentSessions) {\n const session = capture.loadSession(sessionId);\n if (session) {\n const statusColor = session.status === 'completed' ? chalk.green : chalk.yellow;\n console.log(\n chalk.white(` ${session.id}`),\n chalk.gray('|'),\n chalk.cyan(session.name)\n );\n console.log(\n chalk.gray(' Status:'),\n statusColor(session.status),\n chalk.gray('|'),\n chalk.gray('Conversations:'),\n chalk.white(String(session.conversationIds.length)),\n chalk.gray('|'),\n chalk.gray('Tokens:'),\n chalk.white(String(session.tokenUsage.totalTokens))\n );\n console.log(\n chalk.gray(' Started:'),\n chalk.white(new Date(session.startedAt).toLocaleString())\n );\n console.log();\n }\n }\n\n if (sessions.length > limit) {\n console.log(chalk.gray(` ... and ${sessions.length - limit} more sessions`));\n console.log();\n }\n\n } catch (error) {\n console.error(chalk.red('Failed to list sessions:'), String(error));\n process.exit(1);\n }\n });\n\n // Export sessions\n command\n .command('export')\n .description('Export captured sessions')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-o, --output <file>', 'Output file path')\n .option('-f, --format <format>', 'Output format: json or markdown', 'json')\n .option('--session <id>', 'Export specific session')\n .action(async (options) => {\n const spinner = ora('Exporting sessions...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const capture = new HookCaptureSystem(projectRoot);\n\n let sessionsToExport: string[];\n\n if (options.session) {\n sessionsToExport = [options.session];\n } else {\n sessionsToExport = capture.listSessions();\n }\n\n if (sessionsToExport.length === 0) {\n spinner.info('No sessions to export.');\n return;\n }\n\n const exportData = sessionsToExport\n .map(id => capture.loadSession(id as any))\n .filter(Boolean);\n\n if (options.format === 'json') {\n const output = JSON.stringify(exportData, null, 2);\n\n if (options.output) {\n writeFileSync(options.output, output);\n spinner.succeed(`Exported ${exportData.length} session(s) to ${options.output}`);\n } else {\n spinner.stop();\n console.log(output);\n }\n } else if (options.format === 'markdown') {\n let markdown = '# Claude Interaction Sessions\\n\\n';\n\n for (const session of exportData) {\n if (!session) continue;\n markdown += `## ${session.name}\\n\\n`;\n markdown += `- **ID:** ${session.id}\\n`;\n markdown += `- **Status:** ${session.status}\\n`;\n markdown += `- **Purpose:** ${session.purpose || 'N/A'}\\n`;\n markdown += `- **Started:** ${new Date(session.startedAt).toISOString()}\\n`;\n if (session.endedAt) {\n markdown += `- **Ended:** ${new Date(session.endedAt).toISOString()}\\n`;\n }\n markdown += `- **Conversations:** ${session.conversationIds.length}\\n`;\n markdown += `- **Tokens:** ${session.tokenUsage.totalTokens}\\n\\n`;\n }\n\n if (options.output) {\n writeFileSync(options.output, markdown);\n spinner.succeed(`Exported ${exportData.length} session(s) to ${options.output}`);\n } else {\n spinner.stop();\n console.log(markdown);\n }\n }\n\n } catch (error) {\n spinner.fail('Failed to export sessions');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as dist } from "../../../../_virtual/
|
|
1
|
+
import { __exports as dist } from "../../../../_virtual/index6.js";
|
|
2
2
|
import { __require as requireAstSpec } from "./generated/ast-spec.js";
|
|
3
3
|
import { __require as requireLib } from "./lib.js";
|
|
4
4
|
import { __require as requireParserOptions } from "./parser-options.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as dist } from "../../../../_virtual/
|
|
1
|
+
import { __exports as dist } from "../../../../_virtual/index5.js";
|
|
2
2
|
import { __require as requireGetKeys } from "./get-keys.js";
|
|
3
3
|
import { __require as requireVisitorKeys } from "./visitor-keys.js";
|
|
4
4
|
var hasRequiredDist;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavelogic/knowledge-graph-agent",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.7",
|
|
4
4
|
"description": "Knowledge graph agent for Claude Code - generates knowledge graphs, initializes docs, and integrates with claude-flow",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|