@kernel.chat/kbot 3.37.0 → 3.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -7
- package/dist/agent-teams.d.ts +55 -0
- package/dist/agent-teams.d.ts.map +1 -0
- package/dist/agent-teams.js +135 -0
- package/dist/agent-teams.js.map +1 -0
- package/dist/autonomous-contributor.d.ts +88 -0
- package/dist/autonomous-contributor.d.ts.map +1 -0
- package/dist/autonomous-contributor.js +862 -0
- package/dist/autonomous-contributor.js.map +1 -0
- package/dist/collective-network.d.ts +102 -0
- package/dist/collective-network.d.ts.map +1 -0
- package/dist/collective-network.js +634 -0
- package/dist/collective-network.js.map +1 -0
- package/dist/community-autopilot.d.ts +98 -0
- package/dist/community-autopilot.d.ts.map +1 -0
- package/dist/community-autopilot.js +676 -0
- package/dist/community-autopilot.js.map +1 -0
- package/dist/cross-device-sync.d.ts +36 -0
- package/dist/cross-device-sync.d.ts.map +1 -0
- package/dist/cross-device-sync.js +532 -0
- package/dist/cross-device-sync.js.map +1 -0
- package/dist/forge-marketplace-server.d.ts +23 -0
- package/dist/forge-marketplace-server.d.ts.map +1 -0
- package/dist/forge-marketplace-server.js +457 -0
- package/dist/forge-marketplace-server.js.map +1 -0
- package/dist/hooks-integration.d.ts +89 -0
- package/dist/hooks-integration.d.ts.map +1 -0
- package/dist/hooks-integration.js +457 -0
- package/dist/hooks-integration.js.map +1 -0
- package/dist/plugin/index.d.ts +71 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +133 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/voice-loop.d.ts +59 -0
- package/dist/voice-loop.d.ts.map +1 -0
- package/dist/voice-loop.js +525 -0
- package/dist/voice-loop.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
// kbot Hooks Integration — Wire kbot into Claude Code's hook system
|
|
2
|
+
//
|
|
3
|
+
// Claude Code hooks fire at key lifecycle moments. This module generates
|
|
4
|
+
// the hooks configuration for settings.json and dispatches hook events
|
|
5
|
+
// to the right kbot subsystem:
|
|
6
|
+
//
|
|
7
|
+
// FileChanged → kbot pair mode analysis
|
|
8
|
+
// TaskCompleted → meta-agent observation recording
|
|
9
|
+
// SessionStart → load kbot learning context
|
|
10
|
+
// SessionEnd → run dream mode consolidation
|
|
11
|
+
// StopFailure → log to self-defense incident system
|
|
12
|
+
//
|
|
13
|
+
// Usage:
|
|
14
|
+
// import { generateHooksConfig, handleHookEvent } from './hooks-integration.js'
|
|
15
|
+
// const config = generateHooksConfig() // → JSON for settings.json
|
|
16
|
+
// await handleHookEvent('FileChanged', { file: 'src/app.ts' })
|
|
17
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
18
|
+
import { join, extname } from 'node:path';
|
|
19
|
+
import { homedir } from 'node:os';
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Constants
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
24
|
+
/** File extensions that trigger pair mode analysis */
|
|
25
|
+
const ANALYZABLE_EXTENSIONS = new Set([
|
|
26
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
27
|
+
'.py', '.rs', '.go', '.java', '.kt', '.swift',
|
|
28
|
+
'.c', '.cpp', '.h', '.hpp', '.cs',
|
|
29
|
+
'.rb', '.php', '.vue', '.svelte',
|
|
30
|
+
'.css', '.scss', '.less',
|
|
31
|
+
'.json', '.yaml', '.yml', '.toml',
|
|
32
|
+
'.sql', '.graphql', '.gql',
|
|
33
|
+
'.sh', '.bash', '.zsh',
|
|
34
|
+
'.md', '.mdx',
|
|
35
|
+
]);
|
|
36
|
+
/** Paths to ignore for file change analysis */
|
|
37
|
+
const IGNORE_PATTERNS = [
|
|
38
|
+
'node_modules',
|
|
39
|
+
'dist',
|
|
40
|
+
'build',
|
|
41
|
+
'.git',
|
|
42
|
+
'coverage',
|
|
43
|
+
'.next',
|
|
44
|
+
'.nuxt',
|
|
45
|
+
'__pycache__',
|
|
46
|
+
'.cache',
|
|
47
|
+
'target',
|
|
48
|
+
'vendor',
|
|
49
|
+
];
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// 1. generateHooksConfig
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Generate the hooks configuration JSON for Claude Code's settings.json.
|
|
55
|
+
*
|
|
56
|
+
* This produces the `hooks` array that should be merged into
|
|
57
|
+
* `.claude/settings.json` or `~/.claude/settings.json`.
|
|
58
|
+
*
|
|
59
|
+
* Each hook calls `kbot hook-dispatch <event>` with context passed via
|
|
60
|
+
* environment variables.
|
|
61
|
+
*
|
|
62
|
+
* @param options.kbotPath - Path to kbot binary (default: 'kbot')
|
|
63
|
+
* @param options.timeout - Default timeout in ms (default: 30000)
|
|
64
|
+
* @returns The hooks section for settings.json
|
|
65
|
+
*/
|
|
66
|
+
export function generateHooksConfig(options) {
|
|
67
|
+
const kbot = options?.kbotPath ?? 'kbot';
|
|
68
|
+
const defaultTimeout = options?.timeout ?? 30000;
|
|
69
|
+
const hooks = [
|
|
70
|
+
{
|
|
71
|
+
event: 'FileChanged',
|
|
72
|
+
command: `${kbot} hook-dispatch FileChanged`,
|
|
73
|
+
timeout: defaultTimeout,
|
|
74
|
+
matcher: '**/*.{ts,tsx,js,jsx,py,rs,go,java,rb,swift,c,cpp,css,json,yaml,sh}',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
event: 'TaskCompleted',
|
|
78
|
+
command: `${kbot} hook-dispatch TaskCompleted`,
|
|
79
|
+
timeout: 15000,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
event: 'SessionStart',
|
|
83
|
+
command: `${kbot} hook-dispatch SessionStart`,
|
|
84
|
+
timeout: 10000,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
event: 'SessionEnd',
|
|
88
|
+
command: `${kbot} hook-dispatch SessionEnd`,
|
|
89
|
+
timeout: 60000, // Dream mode can take a while
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
event: 'StopFailure',
|
|
93
|
+
command: `${kbot} hook-dispatch StopFailure`,
|
|
94
|
+
timeout: 5000,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
return { hooks };
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// 2. handleHookEvent — dispatcher
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
/**
|
|
103
|
+
* Dispatch a Claude Code hook event to the appropriate kbot subsystem.
|
|
104
|
+
*
|
|
105
|
+
* @param event - The hook event type
|
|
106
|
+
* @param data - Event-specific payload
|
|
107
|
+
* @returns Result of handling the event
|
|
108
|
+
*/
|
|
109
|
+
export async function handleHookEvent(event, data) {
|
|
110
|
+
const start = Date.now();
|
|
111
|
+
try {
|
|
112
|
+
switch (event) {
|
|
113
|
+
case 'FileChanged':
|
|
114
|
+
return await handleFileChanged(data, start);
|
|
115
|
+
case 'TaskCompleted':
|
|
116
|
+
return await handleTaskCompleted(data, start);
|
|
117
|
+
case 'SessionStart':
|
|
118
|
+
return await handleSessionStart(data, start);
|
|
119
|
+
case 'SessionEnd':
|
|
120
|
+
return await handleSessionEnd(data, start);
|
|
121
|
+
case 'StopFailure':
|
|
122
|
+
return await handleStopFailure(data, start);
|
|
123
|
+
default: {
|
|
124
|
+
// Exhaustiveness check
|
|
125
|
+
const _exhaustive = event;
|
|
126
|
+
return {
|
|
127
|
+
event: _exhaustive,
|
|
128
|
+
handled: false,
|
|
129
|
+
subsystem: 'unknown',
|
|
130
|
+
error: `Unknown hook event: ${String(event)}`,
|
|
131
|
+
duration_ms: Date.now() - start,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
138
|
+
return {
|
|
139
|
+
event,
|
|
140
|
+
handled: false,
|
|
141
|
+
subsystem: 'error',
|
|
142
|
+
error: message,
|
|
143
|
+
duration_ms: Date.now() - start,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Event handlers
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
/**
|
|
151
|
+
* FileChanged → Trigger kbot pair mode analysis.
|
|
152
|
+
*
|
|
153
|
+
* Analyzes the changed file for bugs, type errors, security issues,
|
|
154
|
+
* and refactoring opportunities using the pair programming module.
|
|
155
|
+
*/
|
|
156
|
+
async function handleFileChanged(data, startTime) {
|
|
157
|
+
const { file, changeType } = data;
|
|
158
|
+
// Skip non-analyzable files
|
|
159
|
+
const ext = extname(file).toLowerCase();
|
|
160
|
+
if (!ANALYZABLE_EXTENSIONS.has(ext)) {
|
|
161
|
+
return {
|
|
162
|
+
event: 'FileChanged',
|
|
163
|
+
handled: false,
|
|
164
|
+
subsystem: 'pair',
|
|
165
|
+
output: `Skipped: ${ext} not in analyzable extensions`,
|
|
166
|
+
duration_ms: Date.now() - startTime,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Skip ignored paths
|
|
170
|
+
if (IGNORE_PATTERNS.some(p => file.includes(p))) {
|
|
171
|
+
return {
|
|
172
|
+
event: 'FileChanged',
|
|
173
|
+
handled: false,
|
|
174
|
+
subsystem: 'pair',
|
|
175
|
+
output: `Skipped: file in ignored path`,
|
|
176
|
+
duration_ms: Date.now() - startTime,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Skip deletions — nothing to analyze
|
|
180
|
+
if (changeType === 'delete') {
|
|
181
|
+
return {
|
|
182
|
+
event: 'FileChanged',
|
|
183
|
+
handled: false,
|
|
184
|
+
subsystem: 'pair',
|
|
185
|
+
output: 'Skipped: file deleted',
|
|
186
|
+
duration_ms: Date.now() - startTime,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Verify file exists
|
|
190
|
+
if (!existsSync(file)) {
|
|
191
|
+
return {
|
|
192
|
+
event: 'FileChanged',
|
|
193
|
+
handled: false,
|
|
194
|
+
subsystem: 'pair',
|
|
195
|
+
output: `Skipped: file does not exist`,
|
|
196
|
+
duration_ms: Date.now() - startTime,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Dynamic import to avoid loading the entire pair module at startup
|
|
200
|
+
try {
|
|
201
|
+
const { analyzeWithAgent } = await import('./pair.js');
|
|
202
|
+
const analysis = await analyzeWithAgent(file, { agent: 'coder' });
|
|
203
|
+
return {
|
|
204
|
+
event: 'FileChanged',
|
|
205
|
+
handled: true,
|
|
206
|
+
subsystem: 'pair',
|
|
207
|
+
output: analysis,
|
|
208
|
+
duration_ms: Date.now() - startTime,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
213
|
+
return {
|
|
214
|
+
event: 'FileChanged',
|
|
215
|
+
handled: false,
|
|
216
|
+
subsystem: 'pair',
|
|
217
|
+
error: `Pair analysis failed: ${message}`,
|
|
218
|
+
duration_ms: Date.now() - startTime,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* TaskCompleted → Record observation for meta-agent.
|
|
224
|
+
*
|
|
225
|
+
* Every completed task feeds into the meta-agent's observation log,
|
|
226
|
+
* enabling self-improvement through performance analysis.
|
|
227
|
+
*/
|
|
228
|
+
async function handleTaskCompleted(data, startTime) {
|
|
229
|
+
try {
|
|
230
|
+
const { recordObservation } = await import('./meta-agent.js');
|
|
231
|
+
recordObservation({
|
|
232
|
+
timestamp: new Date().toISOString(),
|
|
233
|
+
agent: data.agent || 'unknown',
|
|
234
|
+
task: data.task || 'unspecified',
|
|
235
|
+
tools_used: data.tools_used ?? [],
|
|
236
|
+
success: data.success,
|
|
237
|
+
duration_ms: data.duration_ms,
|
|
238
|
+
tokens_in: data.tokens_in ?? 0,
|
|
239
|
+
tokens_out: data.tokens_out ?? 0,
|
|
240
|
+
cost: data.cost ?? 0,
|
|
241
|
+
user_satisfaction: data.success ? 'positive' : 'negative',
|
|
242
|
+
error: data.error,
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
event: 'TaskCompleted',
|
|
246
|
+
handled: true,
|
|
247
|
+
subsystem: 'meta-agent',
|
|
248
|
+
output: `Recorded observation: ${data.agent}/${data.task} (${data.success ? 'success' : 'failure'})`,
|
|
249
|
+
duration_ms: Date.now() - startTime,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
254
|
+
return {
|
|
255
|
+
event: 'TaskCompleted',
|
|
256
|
+
handled: false,
|
|
257
|
+
subsystem: 'meta-agent',
|
|
258
|
+
error: `Failed to record observation: ${message}`,
|
|
259
|
+
duration_ms: Date.now() - startTime,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* SessionStart → Load kbot learning context.
|
|
265
|
+
*
|
|
266
|
+
* Hydrates the learning engine with patterns, solutions, user profile,
|
|
267
|
+
* and project memory so the session starts with full context.
|
|
268
|
+
*/
|
|
269
|
+
async function handleSessionStart(data, startTime) {
|
|
270
|
+
try {
|
|
271
|
+
const { buildFullLearningContext } = await import('./learning.js');
|
|
272
|
+
// Build learning context for the session's working directory
|
|
273
|
+
const context = buildFullLearningContext('session-start', // seed message for context retrieval
|
|
274
|
+
data.cwd);
|
|
275
|
+
// Also run the kbot session-start lifecycle hook if it exists
|
|
276
|
+
try {
|
|
277
|
+
const { runLifecycleHook } = await import('./hooks.js');
|
|
278
|
+
runLifecycleHook('session-start', data.agent ?? 'auto');
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Non-critical: kbot hooks may not be set up
|
|
282
|
+
}
|
|
283
|
+
const contextSize = context.length;
|
|
284
|
+
const summary = contextSize > 0
|
|
285
|
+
? `Loaded learning context (${contextSize} chars)`
|
|
286
|
+
: 'No learning context available (new project?)';
|
|
287
|
+
return {
|
|
288
|
+
event: 'SessionStart',
|
|
289
|
+
handled: true,
|
|
290
|
+
subsystem: 'learning',
|
|
291
|
+
output: summary,
|
|
292
|
+
duration_ms: Date.now() - startTime,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
297
|
+
return {
|
|
298
|
+
event: 'SessionStart',
|
|
299
|
+
handled: false,
|
|
300
|
+
subsystem: 'learning',
|
|
301
|
+
error: `Failed to load learning context: ${message}`,
|
|
302
|
+
duration_ms: Date.now() - startTime,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* SessionEnd → Run dream mode consolidation.
|
|
308
|
+
*
|
|
309
|
+
* Triggers kbot's dream mode which:
|
|
310
|
+
* - Consolidates short-term memory into long-term patterns
|
|
311
|
+
* - Runs meta-agent cycle (analyze performance, propose improvements)
|
|
312
|
+
* - Speculatively pre-builds tools for tomorrow's tasks
|
|
313
|
+
* - Self-benchmarks against yesterday's performance
|
|
314
|
+
*/
|
|
315
|
+
async function handleSessionEnd(data, startTime) {
|
|
316
|
+
try {
|
|
317
|
+
const { runDreamMode } = await import('./dream-mode.js');
|
|
318
|
+
// Run dream mode with verbose=false (we're in a hook, not interactive)
|
|
319
|
+
const report = await runDreamMode(false);
|
|
320
|
+
// Also run the kbot session-end lifecycle hook
|
|
321
|
+
try {
|
|
322
|
+
const { runLifecycleHook } = await import('./hooks.js');
|
|
323
|
+
runLifecycleHook('session-end', data.agent ?? 'auto');
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Non-critical
|
|
327
|
+
}
|
|
328
|
+
// Also flush any pending learning writes
|
|
329
|
+
try {
|
|
330
|
+
const { flushPendingWrites } = await import('./learning.js');
|
|
331
|
+
flushPendingWrites();
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Non-critical
|
|
335
|
+
}
|
|
336
|
+
const summary = [
|
|
337
|
+
`Dream mode completed in ${report.duration_ms}ms`,
|
|
338
|
+
`Phases: ${report.phases_completed}`,
|
|
339
|
+
`Findings: ${report.total_findings}`,
|
|
340
|
+
`Actions: ${report.total_actions}`,
|
|
341
|
+
`Improvements: ${report.total_improvements}`,
|
|
342
|
+
].join(', ');
|
|
343
|
+
return {
|
|
344
|
+
event: 'SessionEnd',
|
|
345
|
+
handled: true,
|
|
346
|
+
subsystem: 'dream-mode',
|
|
347
|
+
output: summary,
|
|
348
|
+
duration_ms: Date.now() - startTime,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
353
|
+
return {
|
|
354
|
+
event: 'SessionEnd',
|
|
355
|
+
handled: false,
|
|
356
|
+
subsystem: 'dream-mode',
|
|
357
|
+
error: `Dream mode failed: ${message}`,
|
|
358
|
+
duration_ms: Date.now() - startTime,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* StopFailure → Log to self-defense incident system.
|
|
364
|
+
*
|
|
365
|
+
* When Claude Code encounters a stop failure (tool rejection, permission
|
|
366
|
+
* denial, safety filter), kbot logs it as a security incident for
|
|
367
|
+
* anomaly detection and pattern analysis.
|
|
368
|
+
*/
|
|
369
|
+
async function handleStopFailure(data, startTime) {
|
|
370
|
+
try {
|
|
371
|
+
const { logIncident } = await import('./self-defense.js');
|
|
372
|
+
// Determine severity based on context
|
|
373
|
+
const severity = determineSeverity(data);
|
|
374
|
+
logIncident('stop_failure', severity, buildIncidentDescription(data), 'logged');
|
|
375
|
+
return {
|
|
376
|
+
event: 'StopFailure',
|
|
377
|
+
handled: true,
|
|
378
|
+
subsystem: 'self-defense',
|
|
379
|
+
output: `Incident logged: ${severity} — ${data.reason.slice(0, 100)}`,
|
|
380
|
+
duration_ms: Date.now() - startTime,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
385
|
+
return {
|
|
386
|
+
event: 'StopFailure',
|
|
387
|
+
handled: false,
|
|
388
|
+
subsystem: 'self-defense',
|
|
389
|
+
error: `Failed to log incident: ${message}`,
|
|
390
|
+
duration_ms: Date.now() - startTime,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// ---------------------------------------------------------------------------
|
|
395
|
+
// Helpers
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
397
|
+
/** Determine incident severity from stop failure data */
|
|
398
|
+
function determineSeverity(data) {
|
|
399
|
+
const reason = data.reason.toLowerCase();
|
|
400
|
+
// High severity: potential security issues
|
|
401
|
+
if (reason.includes('injection') || reason.includes('malicious') || reason.includes('exploit')) {
|
|
402
|
+
return 'high';
|
|
403
|
+
}
|
|
404
|
+
// Medium severity: permission or safety issues
|
|
405
|
+
if (reason.includes('permission') || reason.includes('denied') || reason.includes('blocked')) {
|
|
406
|
+
return 'medium';
|
|
407
|
+
}
|
|
408
|
+
// Medium severity: command failures that might indicate attacks
|
|
409
|
+
if (data.exitCode && data.exitCode > 128) {
|
|
410
|
+
return 'medium';
|
|
411
|
+
}
|
|
412
|
+
// Low severity: general failures
|
|
413
|
+
return 'low';
|
|
414
|
+
}
|
|
415
|
+
/** Build a descriptive string for the incident log */
|
|
416
|
+
function buildIncidentDescription(data) {
|
|
417
|
+
const parts = [
|
|
418
|
+
`Stop failure: ${data.reason}`,
|
|
419
|
+
];
|
|
420
|
+
if (data.command) {
|
|
421
|
+
parts.push(`Command: ${data.command.slice(0, 200)}`);
|
|
422
|
+
}
|
|
423
|
+
if (data.exitCode !== undefined) {
|
|
424
|
+
parts.push(`Exit code: ${data.exitCode}`);
|
|
425
|
+
}
|
|
426
|
+
if (data.stderr) {
|
|
427
|
+
parts.push(`Stderr: ${data.stderr.slice(0, 300)}`);
|
|
428
|
+
}
|
|
429
|
+
return parts.join(' | ');
|
|
430
|
+
}
|
|
431
|
+
// ---------------------------------------------------------------------------
|
|
432
|
+
// Convenience: merge into existing settings.json
|
|
433
|
+
// ---------------------------------------------------------------------------
|
|
434
|
+
/**
|
|
435
|
+
* Read existing Claude Code settings.json and merge kbot hooks into it.
|
|
436
|
+
* Returns the merged JSON object. Does not write to disk.
|
|
437
|
+
*
|
|
438
|
+
* @param settingsPath - Path to settings.json (default: .claude/settings.json)
|
|
439
|
+
*/
|
|
440
|
+
export function mergeHooksIntoSettings(settingsPath, kbotPath) {
|
|
441
|
+
const defaultPath = join(process.cwd(), '.claude', 'settings.json');
|
|
442
|
+
const filePath = settingsPath ?? defaultPath;
|
|
443
|
+
let existing = {};
|
|
444
|
+
if (existsSync(filePath)) {
|
|
445
|
+
try {
|
|
446
|
+
existing = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
// Start fresh if parse fails
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
const hooksConfig = generateHooksConfig({ kbotPath });
|
|
453
|
+
// Merge: replace any existing hooks array
|
|
454
|
+
existing['hooks'] = hooksConfig.hooks;
|
|
455
|
+
return existing;
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=hooks-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-integration.js","sourceRoot":"","sources":["../src/hooks-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type BridgeStatus } from '../ide/bridge.js';
|
|
2
|
+
export interface PluginContext {
|
|
3
|
+
/** Working directory for kbot to operate in */
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** Default agent to use */
|
|
6
|
+
agent?: string;
|
|
7
|
+
/** API tier override */
|
|
8
|
+
tier?: string;
|
|
9
|
+
/** Skip starting the MCP server (e.g., if already running) */
|
|
10
|
+
skipMcp?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface SkillDefinition {
|
|
13
|
+
/** Skill name (matches manifest) */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Human-readable description */
|
|
16
|
+
description: string;
|
|
17
|
+
/** Path to the skill markdown file */
|
|
18
|
+
file: string;
|
|
19
|
+
/** The kbot CLI command this skill maps to */
|
|
20
|
+
command: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PluginManifest {
|
|
23
|
+
name: string;
|
|
24
|
+
version: string;
|
|
25
|
+
description: string;
|
|
26
|
+
homepage: string;
|
|
27
|
+
repository: string;
|
|
28
|
+
license: string;
|
|
29
|
+
mcpServers: Record<string, {
|
|
30
|
+
command: string;
|
|
31
|
+
args: string[];
|
|
32
|
+
env: Record<string, string>;
|
|
33
|
+
}>;
|
|
34
|
+
channels: Record<string, {
|
|
35
|
+
command: string;
|
|
36
|
+
args: string[];
|
|
37
|
+
}>;
|
|
38
|
+
skills: Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
file: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load and return the plugin manifest.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getManifest(): PluginManifest;
|
|
48
|
+
/**
|
|
49
|
+
* Skill definitions mapping Claude Code slash commands to kbot CLI commands.
|
|
50
|
+
*/
|
|
51
|
+
export declare const skills: SkillDefinition[];
|
|
52
|
+
/**
|
|
53
|
+
* Load the markdown content of a skill file.
|
|
54
|
+
*/
|
|
55
|
+
export declare function loadSkillContent(skillName: string): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Activate the kbot plugin.
|
|
58
|
+
*
|
|
59
|
+
* Initializes the IDE bridge (registers tools, gathers project context)
|
|
60
|
+
* and optionally starts the MCP server for tool communication.
|
|
61
|
+
*/
|
|
62
|
+
export declare function activate(context?: PluginContext): Promise<BridgeStatus>;
|
|
63
|
+
/**
|
|
64
|
+
* Deactivate the kbot plugin. Cleans up resources.
|
|
65
|
+
*/
|
|
66
|
+
export declare function deactivate(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Check if the plugin is currently activated.
|
|
69
|
+
*/
|
|
70
|
+
export declare function isActivated(): boolean;
|
|
71
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAI9F,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IAC5F,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC7D,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnE;AAUD;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAW5C;AAID;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,eAAe,EA+BnC,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBjE;AAID;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BjF;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// kbot Claude Code Plugin — Entry point
|
|
2
|
+
//
|
|
3
|
+
// Bridges kbot's full cognitive engine into Claude Code as a plugin.
|
|
4
|
+
// Starts the MCP server, registers tools, sets up the Channel for
|
|
5
|
+
// two-way communication, and exports skills that map to kbot commands.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// As a Claude Code plugin, this module is loaded automatically when
|
|
9
|
+
// the plugin manifest is registered. It can also be imported directly:
|
|
10
|
+
//
|
|
11
|
+
// import { activate, deactivate, skills } from './plugin/index.js'
|
|
12
|
+
// await activate({ cwd: process.cwd() })
|
|
13
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
14
|
+
import { join, dirname } from 'node:path';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { startMcpServer } from '../ide/mcp-server.js';
|
|
17
|
+
import { initBridge, getStatus } from '../ide/bridge.js';
|
|
18
|
+
// ── State ───────────────────────────────────────────────────────────────────
|
|
19
|
+
let activated = false;
|
|
20
|
+
// ── Manifest ────────────────────────────────────────────────────────────────
|
|
21
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
/**
|
|
23
|
+
* Load and return the plugin manifest.
|
|
24
|
+
*/
|
|
25
|
+
export function getManifest() {
|
|
26
|
+
const manifestPath = join(__dirname, 'manifest.json');
|
|
27
|
+
if (!existsSync(manifestPath)) {
|
|
28
|
+
// Fallback for compiled output where manifest.json may be at a different relative path
|
|
29
|
+
const altPath = join(__dirname, '..', 'plugin', 'manifest.json');
|
|
30
|
+
if (existsSync(altPath)) {
|
|
31
|
+
return JSON.parse(readFileSync(altPath, 'utf-8'));
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`kbot plugin manifest not found at ${manifestPath}`);
|
|
34
|
+
}
|
|
35
|
+
return JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
36
|
+
}
|
|
37
|
+
// ── Skills ──────────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Skill definitions mapping Claude Code slash commands to kbot CLI commands.
|
|
40
|
+
*/
|
|
41
|
+
export const skills = [
|
|
42
|
+
{
|
|
43
|
+
name: 'dream',
|
|
44
|
+
description: 'Run kbot dream mode — memory consolidation, meta-agent cycle, forge speculation, and self-benchmarking',
|
|
45
|
+
file: 'skills/dream.md',
|
|
46
|
+
command: 'kbot dream',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'dashboard',
|
|
50
|
+
description: "Show kbot's live learning dashboard — tool usage, agent routing, growth metrics",
|
|
51
|
+
file: 'skills/dashboard.md',
|
|
52
|
+
command: 'kbot dashboard',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'pair',
|
|
56
|
+
description: 'Start pair programming mode — file watcher with real-time AI suggestions and auto-fix',
|
|
57
|
+
file: 'skills/pair.md',
|
|
58
|
+
command: 'kbot pair',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'guardian',
|
|
62
|
+
description: 'Run codebase guardian — detect duplicates, co-change patterns, and complexity hotspots',
|
|
63
|
+
file: 'skills/guardian.md',
|
|
64
|
+
command: 'kbot guardian',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'meta',
|
|
68
|
+
description: 'Run meta-agent cycle — analyze task agent performance, propose and apply improvements',
|
|
69
|
+
file: 'skills/meta.md',
|
|
70
|
+
command: 'kbot meta',
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Load the markdown content of a skill file.
|
|
75
|
+
*/
|
|
76
|
+
export function loadSkillContent(skillName) {
|
|
77
|
+
const skill = skills.find(s => s.name === skillName);
|
|
78
|
+
if (!skill)
|
|
79
|
+
return null;
|
|
80
|
+
const skillPath = join(__dirname, skill.file);
|
|
81
|
+
if (existsSync(skillPath)) {
|
|
82
|
+
return readFileSync(skillPath, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
// Fallback for compiled output
|
|
85
|
+
const altPath = join(__dirname, '..', 'plugin', skill.file);
|
|
86
|
+
if (existsSync(altPath)) {
|
|
87
|
+
return readFileSync(altPath, 'utf-8');
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// ── Lifecycle ───────────────────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Activate the kbot plugin.
|
|
94
|
+
*
|
|
95
|
+
* Initializes the IDE bridge (registers tools, gathers project context)
|
|
96
|
+
* and optionally starts the MCP server for tool communication.
|
|
97
|
+
*/
|
|
98
|
+
export async function activate(context = {}) {
|
|
99
|
+
if (activated) {
|
|
100
|
+
return getStatus();
|
|
101
|
+
}
|
|
102
|
+
const bridgeConfig = {
|
|
103
|
+
cwd: context.cwd,
|
|
104
|
+
agent: context.agent,
|
|
105
|
+
tier: context.tier,
|
|
106
|
+
};
|
|
107
|
+
// Initialize the bridge — registers all tools and gathers project context
|
|
108
|
+
await initBridge(bridgeConfig);
|
|
109
|
+
// Start MCP server unless explicitly skipped
|
|
110
|
+
if (!context.skipMcp) {
|
|
111
|
+
// Start in background — the MCP server runs on stdio and blocks,
|
|
112
|
+
// so we only start it if this is the main plugin entry point
|
|
113
|
+
startMcpServer(bridgeConfig).catch((err) => {
|
|
114
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
+
console.error(`[kbot plugin] MCP server error: ${message}`);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
activated = true;
|
|
119
|
+
return getStatus();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Deactivate the kbot plugin. Cleans up resources.
|
|
123
|
+
*/
|
|
124
|
+
export function deactivate() {
|
|
125
|
+
activated = false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if the plugin is currently activated.
|
|
129
|
+
*/
|
|
130
|
+
export function isActivated() {
|
|
131
|
+
return activated;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=index.js.map
|