@phuetz/code-buddy 0.1.18 → 0.1.19
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/agent/background-tasks.d.ts +49 -0
- package/dist/agent/background-tasks.js +153 -0
- package/dist/agent/background-tasks.js.map +1 -0
- package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
- package/dist/agent/definitions/agent-definition-loader.js +161 -0
- package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
- package/dist/agent/definitions/index.d.ts +1 -0
- package/dist/agent/definitions/index.js +2 -0
- package/dist/agent/definitions/index.js.map +1 -0
- package/dist/agent/extended-thinking.d.ts +64 -0
- package/dist/agent/extended-thinking.js +103 -0
- package/dist/agent/extended-thinking.js.map +1 -0
- package/dist/agent/prompt-suggestions.d.ts +55 -0
- package/dist/agent/prompt-suggestions.js +125 -0
- package/dist/agent/prompt-suggestions.js.map +1 -0
- package/dist/agent/rewind-manager.d.ts +59 -0
- package/dist/agent/rewind-manager.js +124 -0
- package/dist/agent/rewind-manager.js.map +1 -0
- package/dist/agent/teams/agent-team.d.ts +54 -0
- package/dist/agent/teams/agent-team.js +114 -0
- package/dist/agent/teams/agent-team.js.map +1 -0
- package/dist/agent/teams/index.d.ts +1 -0
- package/dist/agent/teams/index.js +2 -0
- package/dist/agent/teams/index.js.map +1 -0
- package/dist/agent/teams/team-v2.d.ts +166 -0
- package/dist/agent/teams/team-v2.js +376 -0
- package/dist/agent/teams/team-v2.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +40 -0
- package/dist/channels/imessage/index.js +69 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +36 -0
- package/dist/channels/line/index.js +71 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +34 -0
- package/dist/channels/mattermost/index.js +56 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +37 -0
- package/dist/channels/nextcloud-talk/index.js +67 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/niche-channels.d.ts +61 -0
- package/dist/channels/niche-channels.js +131 -0
- package/dist/channels/niche-channels.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +30 -0
- package/dist/channels/nostr/index.js +68 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/twilio-voice/index.d.ts +37 -0
- package/dist/channels/twilio-voice/index.js +76 -0
- package/dist/channels/twilio-voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.js +0 -1
- package/dist/channels/whatsapp/index.js.map +1 -1
- package/dist/channels/zalo/index.d.ts +28 -0
- package/dist/channels/zalo/index.js +53 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cloud/cloud-sessions.d.ts +56 -0
- package/dist/cloud/cloud-sessions.js +187 -0
- package/dist/cloud/cloud-sessions.js.map +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/commands/handlers/auth-handler.d.ts +32 -0
- package/dist/commands/handlers/auth-handler.js +137 -0
- package/dist/commands/handlers/auth-handler.js.map +1 -0
- package/dist/commands/handlers/context-handler.d.ts +46 -0
- package/dist/commands/handlers/context-handler.js +102 -0
- package/dist/commands/handlers/context-handler.js.map +1 -0
- package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
- package/dist/commands/handlers/keybindings-handler.js +124 -0
- package/dist/commands/handlers/keybindings-handler.js.map +1 -0
- package/dist/commands/handlers/session-commands.d.ts +17 -0
- package/dist/commands/handlers/session-commands.js +119 -0
- package/dist/commands/handlers/session-commands.js.map +1 -0
- package/dist/commands/slash/builtin-commands.js +1 -1
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/admin-config.d.ts +54 -0
- package/dist/config/admin-config.js +144 -0
- package/dist/config/admin-config.js.map +1 -0
- package/dist/config/advanced-config.d.ts +118 -0
- package/dist/config/advanced-config.js +364 -0
- package/dist/config/advanced-config.js.map +1 -0
- package/dist/config/managed-policies.d.ts +50 -0
- package/dist/config/managed-policies.js +120 -0
- package/dist/config/managed-policies.js.map +1 -0
- package/dist/config/settings-hierarchy.d.ts +59 -0
- package/dist/config/settings-hierarchy.js +188 -0
- package/dist/config/settings-hierarchy.js.map +1 -0
- package/dist/config/tool-profiles.d.ts +37 -0
- package/dist/config/tool-profiles.js +150 -0
- package/dist/config/tool-profiles.js.map +1 -0
- package/dist/config/user-settings.d.ts +31 -0
- package/dist/config/user-settings.js +66 -0
- package/dist/config/user-settings.js.map +1 -0
- package/dist/context/context-files.d.ts +1 -1
- package/dist/context/context-files.js +2 -2
- package/dist/context/context-files.js.map +1 -1
- package/dist/context/partial-summarizer.d.ts +32 -0
- package/dist/context/partial-summarizer.js +144 -0
- package/dist/context/partial-summarizer.js.map +1 -0
- package/dist/desktop/desktop-app.d.ts +44 -0
- package/dist/desktop/desktop-app.js +136 -0
- package/dist/desktop/desktop-app.js.map +1 -0
- package/dist/git/worktree-sessions.d.ts +24 -0
- package/dist/git/worktree-sessions.js +93 -0
- package/dist/git/worktree-sessions.js.map +1 -0
- package/dist/hooks/advanced-hooks.d.ts +110 -0
- package/dist/hooks/advanced-hooks.js +256 -0
- package/dist/hooks/advanced-hooks.js.map +1 -0
- package/dist/hooks/async-hooks.d.ts +73 -0
- package/dist/hooks/async-hooks.js +213 -0
- package/dist/hooks/async-hooks.js.map +1 -0
- package/dist/hooks/env-persistence.d.ts +58 -0
- package/dist/hooks/env-persistence.js +195 -0
- package/dist/hooks/env-persistence.js.map +1 -0
- package/dist/hooks/hook-events.d.ts +36 -0
- package/dist/hooks/hook-events.js +55 -0
- package/dist/hooks/hook-events.js.map +1 -0
- package/dist/hooks/smart-hooks.d.ts +85 -0
- package/dist/hooks/smart-hooks.js +199 -0
- package/dist/hooks/smart-hooks.js.map +1 -0
- package/dist/ide/jetbrains-plugin.d.ts +55 -0
- package/dist/ide/jetbrains-plugin.js +156 -0
- package/dist/ide/jetbrains-plugin.js.map +1 -0
- package/dist/ide/vscode-extension.d.ts +94 -0
- package/dist/ide/vscode-extension.js +229 -0
- package/dist/ide/vscode-extension.js.map +1 -0
- package/dist/index.js +77 -3
- package/dist/index.js.map +1 -1
- package/dist/input/file-autocomplete.d.ts +42 -0
- package/dist/input/file-autocomplete.js +154 -0
- package/dist/input/file-autocomplete.js.map +1 -0
- package/dist/integrations/chrome-bridge.d.ts +90 -0
- package/dist/integrations/chrome-bridge.js +151 -0
- package/dist/integrations/chrome-bridge.js.map +1 -0
- package/dist/integrations/github-action-runner.d.ts +40 -0
- package/dist/integrations/github-action-runner.js +163 -0
- package/dist/integrations/github-action-runner.js.map +1 -0
- package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
- package/dist/integrations/gitlab-ci-runner.js +104 -0
- package/dist/integrations/gitlab-ci-runner.js.map +1 -0
- package/dist/integrations/pr-session-linker.d.ts +44 -0
- package/dist/integrations/pr-session-linker.js +103 -0
- package/dist/integrations/pr-session-linker.js.map +1 -0
- package/dist/integrations/tailscale.d.ts +36 -0
- package/dist/integrations/tailscale.js +101 -0
- package/dist/integrations/tailscale.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +68 -0
- package/dist/lsp/lsp-client.js +182 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/mcp/connectors.d.ts +28 -0
- package/dist/mcp/connectors.js +148 -0
- package/dist/mcp/connectors.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -4
- package/dist/mcp/index.js +7 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
- package/dist/mcp/mcp-auto-discovery.js +104 -0
- package/dist/mcp/mcp-auto-discovery.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +70 -0
- package/dist/mcp/mcp-server.js +374 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/memory/auto-memory.d.ts +53 -0
- package/dist/memory/auto-memory.js +250 -0
- package/dist/memory/auto-memory.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +51 -0
- package/dist/memory/hybrid-search.js +199 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/memory-flush.d.ts +51 -0
- package/dist/memory/memory-flush.js +102 -0
- package/dist/memory/memory-flush.js.map +1 -0
- package/dist/memory/subagent-memory.d.ts +73 -0
- package/dist/memory/subagent-memory.js +172 -0
- package/dist/memory/subagent-memory.js.map +1 -0
- package/dist/nodes/device-node.d.ts +40 -0
- package/dist/nodes/device-node.js +117 -0
- package/dist/nodes/device-node.js.map +1 -0
- package/dist/output/json-schema-output.d.ts +67 -0
- package/dist/output/json-schema-output.js +273 -0
- package/dist/output/json-schema-output.js.map +1 -0
- package/dist/persistence/session-picker.d.ts +22 -0
- package/dist/persistence/session-picker.js +47 -0
- package/dist/persistence/session-picker.js.map +1 -0
- package/dist/persistence/session-store.d.ts +11 -0
- package/dist/persistence/session-store.js +17 -0
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
- package/dist/plugins/git-pinned-marketplace.js +152 -0
- package/dist/plugins/git-pinned-marketplace.js.map +1 -0
- package/dist/plugins/plugin-manifest.d.ts +116 -0
- package/dist/plugins/plugin-manifest.js +283 -0
- package/dist/plugins/plugin-manifest.js.map +1 -0
- package/dist/sandbox/os-sandbox.d.ts +49 -1
- package/dist/sandbox/os-sandbox.js +347 -6
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/sdk/agent-sdk.d.ts +61 -0
- package/dist/sdk/agent-sdk.js +90 -0
- package/dist/sdk/agent-sdk.js.map +1 -0
- package/dist/security/permission-modes.d.ts +76 -0
- package/dist/security/permission-modes.js +195 -0
- package/dist/security/permission-modes.js.map +1 -0
- package/dist/security/permission-patterns.d.ts +61 -0
- package/dist/security/permission-patterns.js +171 -0
- package/dist/security/permission-patterns.js.map +1 -0
- package/dist/security/safe-binaries.d.ts +23 -0
- package/dist/security/safe-binaries.js +96 -0
- package/dist/security/safe-binaries.js.map +1 -0
- package/dist/security/sender-policies.d.ts +46 -0
- package/dist/security/sender-policies.js +90 -0
- package/dist/security/sender-policies.js.map +1 -0
- package/dist/server/dashboard.d.ts +53 -0
- package/dist/server/dashboard.js +93 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/services/system-prompt-override.d.ts +34 -0
- package/dist/services/system-prompt-override.js +64 -0
- package/dist/services/system-prompt-override.js.map +1 -0
- package/dist/skills/skill-enhancements.d.ts +37 -0
- package/dist/skills/skill-enhancements.js +69 -0
- package/dist/skills/skill-enhancements.js.map +1 -0
- package/dist/telemetry/otel-tracer.d.ts +98 -0
- package/dist/telemetry/otel-tracer.js +245 -0
- package/dist/telemetry/otel-tracer.js.map +1 -0
- package/dist/tools/browser-stub.d.ts +61 -0
- package/dist/tools/browser-stub.js +184 -0
- package/dist/tools/browser-stub.js.map +1 -0
- package/dist/tools/gateway-tool.d.ts +43 -0
- package/dist/tools/gateway-tool.js +92 -0
- package/dist/tools/gateway-tool.js.map +1 -0
- package/dist/tools/image-stub.d.ts +32 -0
- package/dist/tools/image-stub.js +97 -0
- package/dist/tools/image-stub.js.map +1 -0
- package/dist/tools/js-repl.d.ts +78 -0
- package/dist/tools/js-repl.js +280 -0
- package/dist/tools/js-repl.js.map +1 -0
- package/dist/tools/message-tool.d.ts +42 -0
- package/dist/tools/message-tool.js +113 -0
- package/dist/tools/message-tool.js.map +1 -0
- package/dist/ui/cli-enhancements.d.ts +178 -0
- package/dist/ui/cli-enhancements.js +430 -0
- package/dist/ui/cli-enhancements.js.map +1 -0
- package/dist/ui/status-line.d.ts +90 -0
- package/dist/ui/status-line.js +160 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/terminal-enhancements.d.ts +34 -0
- package/dist/ui/terminal-enhancements.js +97 -0
- package/dist/ui/terminal-enhancements.js.map +1 -0
- package/dist/ui/ui-enhancements.d.ts +38 -0
- package/dist/ui/ui-enhancements.js +116 -0
- package/dist/ui/ui-enhancements.js.map +1 -0
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/init-project.d.ts +1 -1
- package/dist/utils/init-project.js +20 -20
- package/dist/utils/init-project.js.map +1 -1
- package/dist/utils/output-schema-validator.d.ts +40 -0
- package/dist/utils/output-schema-validator.js +137 -0
- package/dist/utils/output-schema-validator.js.map +1 -0
- package/dist/utils/safety-misc.d.ts +24 -0
- package/dist/utils/safety-misc.js +91 -0
- package/dist/utils/safety-misc.js.map +1 -0
- package/dist/utils/session-enhancements.d.ts +40 -0
- package/dist/utils/session-enhancements.js +118 -0
- package/dist/utils/session-enhancements.js.map +1 -0
- package/dist/utils/shell-snapshot.d.ts +38 -0
- package/dist/utils/shell-snapshot.js +323 -0
- package/dist/utils/shell-snapshot.js.map +1 -0
- package/dist/utils/stream-json-formatter.d.ts +77 -0
- package/dist/utils/stream-json-formatter.js +61 -0
- package/dist/utils/stream-json-formatter.js.map +1 -0
- package/dist/workflows/lobster-engine.d.ts +43 -0
- package/dist/workflows/lobster-engine.js +167 -0
- package/dist/workflows/lobster-engine.js.map +1 -0
- package/package.json +3 -6
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JetBrains Plugin Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and JetBrains IDEs (IntelliJ IDEA, PyCharm,
|
|
5
|
+
* WebStorm, GoLand, etc). Provides diff viewing, selection sharing,
|
|
6
|
+
* diagnostic sharing, and quick launch integration.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
enableDiffViewer: true,
|
|
11
|
+
enableSelectionSharing: true,
|
|
12
|
+
enableDiagnosticSharing: true,
|
|
13
|
+
quickLaunchShortcut: 'Ctrl+Shift+B',
|
|
14
|
+
supportedIDEs: [
|
|
15
|
+
'IntelliJ IDEA',
|
|
16
|
+
'PyCharm',
|
|
17
|
+
'WebStorm',
|
|
18
|
+
'GoLand',
|
|
19
|
+
'PhpStorm',
|
|
20
|
+
'Rider',
|
|
21
|
+
'CLion',
|
|
22
|
+
'RubyMine',
|
|
23
|
+
'DataGrip',
|
|
24
|
+
'Android Studio',
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
export class JetBrainsBridge {
|
|
28
|
+
config;
|
|
29
|
+
diffs;
|
|
30
|
+
sharedSelections;
|
|
31
|
+
diagnostics;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
34
|
+
this.diffs = new Map();
|
|
35
|
+
this.sharedSelections = [];
|
|
36
|
+
this.diagnostics = [];
|
|
37
|
+
logger.debug('JetBrainsBridge initialized', { shortcut: this.config.quickLaunchShortcut });
|
|
38
|
+
}
|
|
39
|
+
createDiff(file, before, after) {
|
|
40
|
+
if (!this.config.enableDiffViewer) {
|
|
41
|
+
throw new Error('Diff viewer is disabled');
|
|
42
|
+
}
|
|
43
|
+
let changeType;
|
|
44
|
+
if (before.length === 0 && after.length > 0) {
|
|
45
|
+
changeType = 'created';
|
|
46
|
+
}
|
|
47
|
+
else if (before.length > 0 && after.length === 0) {
|
|
48
|
+
changeType = 'deleted';
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
changeType = 'modified';
|
|
52
|
+
}
|
|
53
|
+
const diff = { file, before, after, changeType };
|
|
54
|
+
this.diffs.set(file, diff);
|
|
55
|
+
logger.info('Diff created', { file, changeType });
|
|
56
|
+
return { ...diff };
|
|
57
|
+
}
|
|
58
|
+
getDiffs() {
|
|
59
|
+
return Array.from(this.diffs.values()).map(d => ({ ...d }));
|
|
60
|
+
}
|
|
61
|
+
acceptDiff(file) {
|
|
62
|
+
if (!this.diffs.has(file)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
this.diffs.delete(file);
|
|
66
|
+
logger.info('Diff accepted', { file });
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
rejectDiff(file) {
|
|
70
|
+
if (!this.diffs.has(file)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
this.diffs.delete(file);
|
|
74
|
+
logger.info('Diff rejected', { file });
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
clearDiffs() {
|
|
78
|
+
this.diffs.clear();
|
|
79
|
+
logger.info('All diffs cleared');
|
|
80
|
+
}
|
|
81
|
+
shareSelection(file, text) {
|
|
82
|
+
if (!this.config.enableSelectionSharing) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.sharedSelections.push({
|
|
86
|
+
file,
|
|
87
|
+
text,
|
|
88
|
+
timestamp: Date.now(),
|
|
89
|
+
});
|
|
90
|
+
logger.debug('Selection shared', { file, length: text.length });
|
|
91
|
+
}
|
|
92
|
+
getSharedSelections() {
|
|
93
|
+
return [...this.sharedSelections];
|
|
94
|
+
}
|
|
95
|
+
shareDiagnostic(file, line, message, type) {
|
|
96
|
+
if (!this.config.enableDiagnosticSharing) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.diagnostics.push({ file, line, message, type });
|
|
100
|
+
logger.debug('Diagnostic shared', { file, line, type });
|
|
101
|
+
}
|
|
102
|
+
getDiagnostics() {
|
|
103
|
+
return [...this.diagnostics];
|
|
104
|
+
}
|
|
105
|
+
clearDiagnostics() {
|
|
106
|
+
this.diagnostics = [];
|
|
107
|
+
logger.info('Diagnostics cleared');
|
|
108
|
+
}
|
|
109
|
+
getQuickLaunchShortcut() {
|
|
110
|
+
return this.config.quickLaunchShortcut;
|
|
111
|
+
}
|
|
112
|
+
setQuickLaunchShortcut(shortcut) {
|
|
113
|
+
if (!shortcut || shortcut.trim().length === 0) {
|
|
114
|
+
throw new Error('Shortcut cannot be empty');
|
|
115
|
+
}
|
|
116
|
+
this.config.quickLaunchShortcut = shortcut.trim();
|
|
117
|
+
logger.info('Quick launch shortcut updated', { shortcut: this.config.quickLaunchShortcut });
|
|
118
|
+
}
|
|
119
|
+
getSupportedIDEs() {
|
|
120
|
+
return [...this.config.supportedIDEs];
|
|
121
|
+
}
|
|
122
|
+
isIDESupported(ide) {
|
|
123
|
+
return this.config.supportedIDEs.some(supported => supported.toLowerCase() === ide.toLowerCase());
|
|
124
|
+
}
|
|
125
|
+
generatePluginXml() {
|
|
126
|
+
return `<idea-plugin>
|
|
127
|
+
<id>com.codebuddy.jetbrains</id>
|
|
128
|
+
<name>Code Buddy</name>
|
|
129
|
+
<version>0.1.0</version>
|
|
130
|
+
<vendor email="support@codebuddy.dev" url="https://codebuddy.dev">Code Buddy</vendor>
|
|
131
|
+
<description><![CDATA[
|
|
132
|
+
AI coding agent for JetBrains IDEs. Provides inline diffs, selection sharing,
|
|
133
|
+
diagnostic context, and quick launch integration.
|
|
134
|
+
]]></description>
|
|
135
|
+
<depends>com.intellij.modules.platform</depends>
|
|
136
|
+
<extensions defaultExtensionNs="com.intellij">
|
|
137
|
+
<toolWindow id="Code Buddy" anchor="right" factoryClass="com.codebuddy.ToolWindowFactory"/>
|
|
138
|
+
<notificationGroup id="Code Buddy" displayType="BALLOON"/>
|
|
139
|
+
</extensions>
|
|
140
|
+
<actions>
|
|
141
|
+
<action id="CodeBuddy.QuickLaunch" class="com.codebuddy.QuickLaunchAction"
|
|
142
|
+
text="Code Buddy: Quick Launch" description="Open Code Buddy panel">
|
|
143
|
+
<keyboard-shortcut keymap="\\$default" first-keystroke="${this.config.quickLaunchShortcut}"/>
|
|
144
|
+
</action>
|
|
145
|
+
<action id="CodeBuddy.ShareSelection" class="com.codebuddy.ShareSelectionAction"
|
|
146
|
+
text="Share Selection with Code Buddy" description="Share selected code with Code Buddy">
|
|
147
|
+
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
|
|
148
|
+
</action>
|
|
149
|
+
</actions>
|
|
150
|
+
</idea-plugin>`;
|
|
151
|
+
}
|
|
152
|
+
getDiffCount() {
|
|
153
|
+
return this.diffs.size;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=jetbrains-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jetbrains-plugin.js","sourceRoot":"","sources":["../../src/ide/jetbrains-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VS Code Extension Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and VS Code, providing inline diffs,
|
|
5
|
+
* @-mentions, plan review, session history, and remote sessions.
|
|
6
|
+
*/
|
|
7
|
+
export interface VSCodeExtensionConfig {
|
|
8
|
+
enableInlineDiffs: boolean;
|
|
9
|
+
enableAtMentions: boolean;
|
|
10
|
+
enablePlanReview: boolean;
|
|
11
|
+
enableSessionHistory: boolean;
|
|
12
|
+
enableRemoteSessions: boolean;
|
|
13
|
+
autoActivatePythonVenv: boolean;
|
|
14
|
+
multilineInput: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface InlineDiff {
|
|
17
|
+
file: string;
|
|
18
|
+
originalContent: string;
|
|
19
|
+
modifiedContent: string;
|
|
20
|
+
hunks: Array<{
|
|
21
|
+
startLine: number;
|
|
22
|
+
endLine: number;
|
|
23
|
+
type: 'add' | 'remove' | 'modify';
|
|
24
|
+
content: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export interface EditorContext {
|
|
28
|
+
file: string;
|
|
29
|
+
selection?: {
|
|
30
|
+
startLine: number;
|
|
31
|
+
endLine: number;
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
diagnostics: Array<{
|
|
35
|
+
line: number;
|
|
36
|
+
message: string;
|
|
37
|
+
severity: string;
|
|
38
|
+
}>;
|
|
39
|
+
language: string;
|
|
40
|
+
}
|
|
41
|
+
interface SessionEntry {
|
|
42
|
+
id: string;
|
|
43
|
+
timestamp: number;
|
|
44
|
+
message: string;
|
|
45
|
+
branch?: string;
|
|
46
|
+
}
|
|
47
|
+
interface PlanReview {
|
|
48
|
+
id: string;
|
|
49
|
+
steps: Array<{
|
|
50
|
+
description: string;
|
|
51
|
+
files: string[];
|
|
52
|
+
approved: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export declare class VSCodeBridge {
|
|
56
|
+
private config;
|
|
57
|
+
private activeDiffs;
|
|
58
|
+
private sessionHistory;
|
|
59
|
+
private plans;
|
|
60
|
+
private remoteSessions;
|
|
61
|
+
private tokensUsed;
|
|
62
|
+
constructor(config?: Partial<VSCodeExtensionConfig>);
|
|
63
|
+
createInlineDiff(file: string, original: string, modified: string): InlineDiff;
|
|
64
|
+
getActiveDiffs(): InlineDiff[];
|
|
65
|
+
acceptDiff(file: string): boolean;
|
|
66
|
+
rejectDiff(file: string): boolean;
|
|
67
|
+
acceptAllDiffs(): number;
|
|
68
|
+
getEditorContext(file: string, selection?: {
|
|
69
|
+
start: number;
|
|
70
|
+
end: number;
|
|
71
|
+
}): EditorContext;
|
|
72
|
+
buildAtMention(context: EditorContext): string;
|
|
73
|
+
addSession(id: string, message: string, branch?: string): void;
|
|
74
|
+
getSessionHistory(): SessionEntry[];
|
|
75
|
+
createPlanReview(steps: Array<{
|
|
76
|
+
description: string;
|
|
77
|
+
files: string[];
|
|
78
|
+
}>): PlanReview;
|
|
79
|
+
approvePlanStep(planId: string, stepIndex: number): boolean;
|
|
80
|
+
listRemoteSessions(): Array<{
|
|
81
|
+
id: string;
|
|
82
|
+
task: string;
|
|
83
|
+
status: string;
|
|
84
|
+
}>;
|
|
85
|
+
resumeRemoteSession(id: string): boolean;
|
|
86
|
+
generatePackageJson(): Record<string, unknown>;
|
|
87
|
+
getUsageInfo(): {
|
|
88
|
+
tokensUsed: number;
|
|
89
|
+
costEstimate: number;
|
|
90
|
+
plan: string;
|
|
91
|
+
};
|
|
92
|
+
private computeHunks;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VS Code Extension Scaffold
|
|
3
|
+
*
|
|
4
|
+
* Bridge between Code Buddy and VS Code, providing inline diffs,
|
|
5
|
+
* @-mentions, plan review, session history, and remote sessions.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
const EXTENSION_TO_LANGUAGE = {
|
|
11
|
+
'.ts': 'typescript', '.tsx': 'typescriptreact',
|
|
12
|
+
'.js': 'javascript', '.jsx': 'javascriptreact',
|
|
13
|
+
'.py': 'python', '.go': 'go', '.rs': 'rust',
|
|
14
|
+
'.java': 'java', '.c': 'c', '.cpp': 'cpp',
|
|
15
|
+
'.cs': 'csharp', '.rb': 'ruby', '.php': 'php',
|
|
16
|
+
'.html': 'html', '.css': 'css', '.json': 'json',
|
|
17
|
+
'.md': 'markdown', '.yaml': 'yaml', '.yml': 'yaml',
|
|
18
|
+
};
|
|
19
|
+
const DEFAULT_CONFIG = {
|
|
20
|
+
enableInlineDiffs: true,
|
|
21
|
+
enableAtMentions: true,
|
|
22
|
+
enablePlanReview: true,
|
|
23
|
+
enableSessionHistory: true,
|
|
24
|
+
enableRemoteSessions: false,
|
|
25
|
+
autoActivatePythonVenv: true,
|
|
26
|
+
multilineInput: true,
|
|
27
|
+
};
|
|
28
|
+
export class VSCodeBridge {
|
|
29
|
+
config;
|
|
30
|
+
activeDiffs;
|
|
31
|
+
sessionHistory;
|
|
32
|
+
plans;
|
|
33
|
+
remoteSessions;
|
|
34
|
+
tokensUsed;
|
|
35
|
+
constructor(config) {
|
|
36
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
37
|
+
this.activeDiffs = new Map();
|
|
38
|
+
this.sessionHistory = [];
|
|
39
|
+
this.plans = new Map();
|
|
40
|
+
this.remoteSessions = [];
|
|
41
|
+
this.tokensUsed = 0;
|
|
42
|
+
logger.debug('VSCodeBridge initialized');
|
|
43
|
+
}
|
|
44
|
+
createInlineDiff(file, original, modified) {
|
|
45
|
+
if (!this.config.enableInlineDiffs) {
|
|
46
|
+
throw new Error('Inline diffs are disabled');
|
|
47
|
+
}
|
|
48
|
+
const hunks = this.computeHunks(original, modified);
|
|
49
|
+
const diff = {
|
|
50
|
+
file,
|
|
51
|
+
originalContent: original,
|
|
52
|
+
modifiedContent: modified,
|
|
53
|
+
hunks,
|
|
54
|
+
};
|
|
55
|
+
this.activeDiffs.set(file, diff);
|
|
56
|
+
logger.info('Inline diff created', { file, hunks: hunks.length });
|
|
57
|
+
return { ...diff };
|
|
58
|
+
}
|
|
59
|
+
getActiveDiffs() {
|
|
60
|
+
return Array.from(this.activeDiffs.values()).map(d => ({ ...d }));
|
|
61
|
+
}
|
|
62
|
+
acceptDiff(file) {
|
|
63
|
+
if (!this.activeDiffs.has(file)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
this.activeDiffs.delete(file);
|
|
67
|
+
logger.info('Diff accepted', { file });
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
rejectDiff(file) {
|
|
71
|
+
if (!this.activeDiffs.has(file)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
this.activeDiffs.delete(file);
|
|
75
|
+
logger.info('Diff rejected', { file });
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
acceptAllDiffs() {
|
|
79
|
+
const count = this.activeDiffs.size;
|
|
80
|
+
this.activeDiffs.clear();
|
|
81
|
+
logger.info('All diffs accepted', { count });
|
|
82
|
+
return count;
|
|
83
|
+
}
|
|
84
|
+
getEditorContext(file, selection) {
|
|
85
|
+
const ext = path.extname(file).toLowerCase();
|
|
86
|
+
const language = EXTENSION_TO_LANGUAGE[ext] || 'plaintext';
|
|
87
|
+
const context = {
|
|
88
|
+
file,
|
|
89
|
+
diagnostics: [],
|
|
90
|
+
language,
|
|
91
|
+
};
|
|
92
|
+
if (selection) {
|
|
93
|
+
context.selection = {
|
|
94
|
+
startLine: selection.start,
|
|
95
|
+
endLine: selection.end,
|
|
96
|
+
text: `[selected lines ${selection.start}-${selection.end}]`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return context;
|
|
100
|
+
}
|
|
101
|
+
buildAtMention(context) {
|
|
102
|
+
if (!this.config.enableAtMentions) {
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
105
|
+
let mention = `@${path.basename(context.file)}`;
|
|
106
|
+
if (context.selection) {
|
|
107
|
+
mention += `:${context.selection.startLine}-${context.selection.endLine}`;
|
|
108
|
+
}
|
|
109
|
+
if (context.diagnostics.length > 0) {
|
|
110
|
+
mention += ` (${context.diagnostics.length} diagnostic(s))`;
|
|
111
|
+
}
|
|
112
|
+
return mention;
|
|
113
|
+
}
|
|
114
|
+
addSession(id, message, branch) {
|
|
115
|
+
if (!this.config.enableSessionHistory) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.sessionHistory.push({
|
|
119
|
+
id,
|
|
120
|
+
timestamp: Date.now(),
|
|
121
|
+
message,
|
|
122
|
+
branch,
|
|
123
|
+
});
|
|
124
|
+
logger.debug('Session added to history', { id });
|
|
125
|
+
}
|
|
126
|
+
getSessionHistory() {
|
|
127
|
+
return [...this.sessionHistory];
|
|
128
|
+
}
|
|
129
|
+
createPlanReview(steps) {
|
|
130
|
+
if (!this.config.enablePlanReview) {
|
|
131
|
+
throw new Error('Plan review is disabled');
|
|
132
|
+
}
|
|
133
|
+
const plan = {
|
|
134
|
+
id: randomUUID(),
|
|
135
|
+
steps: steps.map(s => ({ ...s, approved: false })),
|
|
136
|
+
};
|
|
137
|
+
this.plans.set(plan.id, plan);
|
|
138
|
+
logger.info('Plan review created', { id: plan.id, steps: steps.length });
|
|
139
|
+
return { ...plan, steps: plan.steps.map(s => ({ ...s })) };
|
|
140
|
+
}
|
|
141
|
+
approvePlanStep(planId, stepIndex) {
|
|
142
|
+
const plan = this.plans.get(planId);
|
|
143
|
+
if (!plan) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (stepIndex < 0 || stepIndex >= plan.steps.length) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
plan.steps[stepIndex].approved = true;
|
|
150
|
+
logger.debug('Plan step approved', { planId, stepIndex });
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
listRemoteSessions() {
|
|
154
|
+
if (!this.config.enableRemoteSessions) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
return [...this.remoteSessions];
|
|
158
|
+
}
|
|
159
|
+
resumeRemoteSession(id) {
|
|
160
|
+
if (!this.config.enableRemoteSessions) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const session = this.remoteSessions.find(s => s.id === id);
|
|
164
|
+
if (!session) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
session.status = 'active';
|
|
168
|
+
logger.info('Remote session resumed', { id });
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
generatePackageJson() {
|
|
172
|
+
return {
|
|
173
|
+
name: 'codebuddy-vscode',
|
|
174
|
+
displayName: 'Code Buddy',
|
|
175
|
+
description: 'AI coding agent for VS Code',
|
|
176
|
+
version: '0.1.0',
|
|
177
|
+
publisher: 'codebuddy',
|
|
178
|
+
engines: { vscode: '^1.85.0' },
|
|
179
|
+
categories: ['Programming Languages', 'Machine Learning', 'Other'],
|
|
180
|
+
activationEvents: ['onStartupFinished'],
|
|
181
|
+
main: './dist/extension.js',
|
|
182
|
+
contributes: {
|
|
183
|
+
commands: [
|
|
184
|
+
{ command: 'codebuddy.start', title: 'Code Buddy: Start Session' },
|
|
185
|
+
{ command: 'codebuddy.acceptDiff', title: 'Code Buddy: Accept Diff' },
|
|
186
|
+
{ command: 'codebuddy.rejectDiff', title: 'Code Buddy: Reject Diff' },
|
|
187
|
+
{ command: 'codebuddy.planReview', title: 'Code Buddy: Review Plan' },
|
|
188
|
+
],
|
|
189
|
+
configuration: {
|
|
190
|
+
title: 'Code Buddy',
|
|
191
|
+
properties: {
|
|
192
|
+
'codebuddy.enableInlineDiffs': { type: 'boolean', default: true },
|
|
193
|
+
'codebuddy.enableAtMentions': { type: 'boolean', default: true },
|
|
194
|
+
'codebuddy.enablePlanReview': { type: 'boolean', default: true },
|
|
195
|
+
'codebuddy.multilineInput': { type: 'boolean', default: true },
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
getUsageInfo() {
|
|
202
|
+
return {
|
|
203
|
+
tokensUsed: this.tokensUsed,
|
|
204
|
+
costEstimate: this.tokensUsed * 0.000003,
|
|
205
|
+
plan: 'free',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
computeHunks(original, modified) {
|
|
209
|
+
const origLines = original.split('\n');
|
|
210
|
+
const modLines = modified.split('\n');
|
|
211
|
+
const hunks = [];
|
|
212
|
+
const maxLen = Math.max(origLines.length, modLines.length);
|
|
213
|
+
for (let i = 0; i < maxLen; i++) {
|
|
214
|
+
const origLine = origLines[i];
|
|
215
|
+
const modLine = modLines[i];
|
|
216
|
+
if (origLine === undefined && modLine !== undefined) {
|
|
217
|
+
hunks.push({ startLine: i + 1, endLine: i + 1, type: 'add', content: modLine });
|
|
218
|
+
}
|
|
219
|
+
else if (origLine !== undefined && modLine === undefined) {
|
|
220
|
+
hunks.push({ startLine: i + 1, endLine: i + 1, type: 'remove', content: origLine });
|
|
221
|
+
}
|
|
222
|
+
else if (origLine !== modLine) {
|
|
223
|
+
hunks.push({ startLine: i + 1, endLine: i + 1, type: 'modify', content: modLine });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return hunks;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=vscode-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode-extension.js","sourceRoot":"","sources":["../../src/ide/vscode-extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -400,7 +400,7 @@ Respond with ONLY the commit message, no additional text.`;
|
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
402
|
// Headless mode processing function
|
|
403
|
-
async function processPromptHeadless(prompt, apiKey, baseURL, model, maxToolRounds, selfHealEnabled = true, outputFormat = 'json') {
|
|
403
|
+
async function processPromptHeadless(prompt, apiKey, baseURL, model, maxToolRounds, selfHealEnabled = true, outputFormat = 'json', outputSchemaPath) {
|
|
404
404
|
try {
|
|
405
405
|
const CodeBuddyAgent = await lazyImport.CodeBuddyAgent();
|
|
406
406
|
const agent = new CodeBuddyAgent(apiKey, baseURL, model, maxToolRounds);
|
|
@@ -453,6 +453,18 @@ async function processPromptHeadless(prompt, apiKey, baseURL, model, maxToolRoun
|
|
|
453
453
|
break;
|
|
454
454
|
}
|
|
455
455
|
}
|
|
456
|
+
// Validate output against JSON Schema if --output-schema was provided
|
|
457
|
+
if (outputSchemaPath) {
|
|
458
|
+
const { validateOutputSchema } = await import("./utils/output-schema-validator.js");
|
|
459
|
+
const validation = validateOutputSchema(messages, outputSchemaPath);
|
|
460
|
+
if (!validation.valid) {
|
|
461
|
+
console.error('Output schema validation failed:');
|
|
462
|
+
for (const error of validation.errors) {
|
|
463
|
+
console.error(` - ${error}`);
|
|
464
|
+
}
|
|
465
|
+
process.exit(2);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
456
468
|
// Output in the requested format
|
|
457
469
|
const format = outputFormat.toLowerCase();
|
|
458
470
|
if (format === 'text' || format === 'markdown') {
|
|
@@ -534,6 +546,16 @@ program
|
|
|
534
546
|
.option("--allowed-tools <patterns>", "only enable tools matching patterns (like Claude Code --allowedTools)")
|
|
535
547
|
.option("--mcp-debug", "enable MCP debugging output")
|
|
536
548
|
.option("--allow-outside", "allow file operations outside the workspace directory (disables workspace isolation)")
|
|
549
|
+
.option("--output-schema <path>", "validate headless mode JSON output against a JSON Schema file")
|
|
550
|
+
.option("--add-dir <paths...>", "grant additional writable directories (repeatable)")
|
|
551
|
+
.option("--no-alt-screen", "disable alternate screen buffer for Ink UI")
|
|
552
|
+
.option("--ephemeral", "skip session persistence (do not save session to disk)")
|
|
553
|
+
.option("--system-prompt-override <text>", "replace the entire system prompt with this text")
|
|
554
|
+
.option("--system-prompt-file <path>", "replace the entire system prompt with contents of a file")
|
|
555
|
+
.option("--append-system-prompt <text>", "append text to the default system prompt")
|
|
556
|
+
.option("--append-system-prompt-file <path>", "append file contents to the default system prompt")
|
|
557
|
+
.option("--fallback-model <model>", "auto-fallback model when default is overloaded")
|
|
558
|
+
.option("--from-pr <pr>", "link session to a GitHub pull request (number or URL)")
|
|
537
559
|
.action(async (message, options) => {
|
|
538
560
|
// Handle --setup flag (interactive setup wizard)
|
|
539
561
|
if (options.setup) {
|
|
@@ -666,6 +688,7 @@ program
|
|
|
666
688
|
const _workspaceIsolation = initializeWorkspaceIsolation({
|
|
667
689
|
allowOutside: options.allowOutside,
|
|
668
690
|
directory: process.cwd(),
|
|
691
|
+
additionalPaths: options.addDir,
|
|
669
692
|
});
|
|
670
693
|
if (options.allowOutside) {
|
|
671
694
|
console.error("Warning: Workspace isolation DISABLED - file access is unrestricted");
|
|
@@ -707,6 +730,27 @@ program
|
|
|
707
730
|
console.error("⚠️ DANGEROUS: All permission checks BYPASSED");
|
|
708
731
|
console.error(" Only use this in trusted containers without network access!");
|
|
709
732
|
}
|
|
733
|
+
// Handle --add-dir: grant additional writable directories to sandbox
|
|
734
|
+
if (options.addDir && options.addDir.length > 0) {
|
|
735
|
+
try {
|
|
736
|
+
const { getSandboxManager } = await import("./security/sandbox.js");
|
|
737
|
+
const sandboxManager = getSandboxManager();
|
|
738
|
+
for (const dir of options.addDir) {
|
|
739
|
+
sandboxManager.allowPath(dir);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
catch (_err) {
|
|
743
|
+
// Sandbox manager may not be initialized; dirs already passed to workspace isolation
|
|
744
|
+
}
|
|
745
|
+
console.error(`Writable directories added: ${options.addDir.join(', ')}`);
|
|
746
|
+
}
|
|
747
|
+
// Handle --ephemeral: skip session persistence
|
|
748
|
+
if (options.ephemeral) {
|
|
749
|
+
const { getSessionStore } = await import("./persistence/session-store.js");
|
|
750
|
+
const sessionStore = getSessionStore();
|
|
751
|
+
sessionStore.setEphemeral(true);
|
|
752
|
+
console.error("Ephemeral mode: ENABLED (session will not be saved)");
|
|
753
|
+
}
|
|
710
754
|
// Handle --allowed-tools (like Claude Code --allowedTools)
|
|
711
755
|
if (options.allowedTools) {
|
|
712
756
|
const { setToolFilter, createToolFilter } = await import("./utils/tool-filter.js");
|
|
@@ -759,7 +803,7 @@ program
|
|
|
759
803
|
].filter(Boolean).join('\n\n');
|
|
760
804
|
// Headless mode: process prompt and exit (if prompt, message, or piped input provided)
|
|
761
805
|
if (combinedPrompt && (options.prompt || pipedInput)) {
|
|
762
|
-
await processPromptHeadless(combinedPrompt, apiKey, baseURL, model, maxToolRounds, options.selfHeal !== false, options.output || options.outputFormat || 'json');
|
|
806
|
+
await processPromptHeadless(combinedPrompt, apiKey, baseURL, model, maxToolRounds, options.selfHeal !== false, options.output || options.outputFormat || 'json', options.outputSchema);
|
|
763
807
|
process.exit(0);
|
|
764
808
|
}
|
|
765
809
|
// Initialize rendering system (lazy load)
|
|
@@ -892,7 +936,13 @@ program
|
|
|
892
936
|
// Log startup metrics before UI render
|
|
893
937
|
recordStartupPhase('ui-render');
|
|
894
938
|
logStartupMetrics();
|
|
895
|
-
|
|
939
|
+
// Configure Ink render options
|
|
940
|
+
const inkOptions = { exitOnCtrlC: true };
|
|
941
|
+
if (options.altScreen === false) {
|
|
942
|
+
// --no-alt-screen disables Ink's alternate screen buffer
|
|
943
|
+
inkOptions.patchConsole = false;
|
|
944
|
+
}
|
|
945
|
+
render(React.createElement(ChatInterface, { agent, initialMessage }), inkOptions);
|
|
896
946
|
// Check for updates in background after UI renders
|
|
897
947
|
setImmediate(async () => {
|
|
898
948
|
try {
|
|
@@ -1039,6 +1089,30 @@ program
|
|
|
1039
1089
|
process.exit(1);
|
|
1040
1090
|
}
|
|
1041
1091
|
});
|
|
1092
|
+
// MCP Server command - run Code Buddy as an MCP tool provider over stdio
|
|
1093
|
+
program
|
|
1094
|
+
.command("mcp-server")
|
|
1095
|
+
.description("Start Code Buddy as an MCP server over stdio (for VS Code, Cursor, etc.)")
|
|
1096
|
+
.option("--list", "List available MCP tools and exit")
|
|
1097
|
+
.action(async (options) => {
|
|
1098
|
+
if (options.list) {
|
|
1099
|
+
const { CodeBuddyMCPServer } = await import("./mcp/mcp-server.js");
|
|
1100
|
+
const tools = CodeBuddyMCPServer.getToolDefinitions();
|
|
1101
|
+
for (const tool of tools) {
|
|
1102
|
+
console.log(`${tool.name}: ${tool.description}`);
|
|
1103
|
+
}
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
try {
|
|
1107
|
+
const { CodeBuddyMCPServer } = await import("./mcp/mcp-server.js");
|
|
1108
|
+
const server = new CodeBuddyMCPServer();
|
|
1109
|
+
await server.start();
|
|
1110
|
+
}
|
|
1111
|
+
catch (error) {
|
|
1112
|
+
logger.error("Failed to start MCP server", error instanceof Error ? error : new Error(String(error)));
|
|
1113
|
+
process.exit(1);
|
|
1114
|
+
}
|
|
1115
|
+
});
|
|
1042
1116
|
// Register extracted CLI command modules lazily.
|
|
1043
1117
|
// Each registerXxxCommands function only imports `type { Command }` from commander
|
|
1044
1118
|
// and its action handlers already use dynamic imports, but loading the module
|