@kernel.chat/kbot 3.37.0 → 3.38.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.
@@ -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