@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.
Files changed (273) hide show
  1. package/dist/agent/background-tasks.d.ts +49 -0
  2. package/dist/agent/background-tasks.js +153 -0
  3. package/dist/agent/background-tasks.js.map +1 -0
  4. package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
  5. package/dist/agent/definitions/agent-definition-loader.js +161 -0
  6. package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
  7. package/dist/agent/definitions/index.d.ts +1 -0
  8. package/dist/agent/definitions/index.js +2 -0
  9. package/dist/agent/definitions/index.js.map +1 -0
  10. package/dist/agent/extended-thinking.d.ts +64 -0
  11. package/dist/agent/extended-thinking.js +103 -0
  12. package/dist/agent/extended-thinking.js.map +1 -0
  13. package/dist/agent/prompt-suggestions.d.ts +55 -0
  14. package/dist/agent/prompt-suggestions.js +125 -0
  15. package/dist/agent/prompt-suggestions.js.map +1 -0
  16. package/dist/agent/rewind-manager.d.ts +59 -0
  17. package/dist/agent/rewind-manager.js +124 -0
  18. package/dist/agent/rewind-manager.js.map +1 -0
  19. package/dist/agent/teams/agent-team.d.ts +54 -0
  20. package/dist/agent/teams/agent-team.js +114 -0
  21. package/dist/agent/teams/agent-team.js.map +1 -0
  22. package/dist/agent/teams/index.d.ts +1 -0
  23. package/dist/agent/teams/index.js +2 -0
  24. package/dist/agent/teams/index.js.map +1 -0
  25. package/dist/agent/teams/team-v2.d.ts +166 -0
  26. package/dist/agent/teams/team-v2.js +376 -0
  27. package/dist/agent/teams/team-v2.js.map +1 -0
  28. package/dist/channels/imessage/index.d.ts +40 -0
  29. package/dist/channels/imessage/index.js +69 -0
  30. package/dist/channels/imessage/index.js.map +1 -0
  31. package/dist/channels/line/index.d.ts +36 -0
  32. package/dist/channels/line/index.js +71 -0
  33. package/dist/channels/line/index.js.map +1 -0
  34. package/dist/channels/mattermost/index.d.ts +34 -0
  35. package/dist/channels/mattermost/index.js +56 -0
  36. package/dist/channels/mattermost/index.js.map +1 -0
  37. package/dist/channels/nextcloud-talk/index.d.ts +37 -0
  38. package/dist/channels/nextcloud-talk/index.js +67 -0
  39. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  40. package/dist/channels/niche-channels.d.ts +61 -0
  41. package/dist/channels/niche-channels.js +131 -0
  42. package/dist/channels/niche-channels.js.map +1 -0
  43. package/dist/channels/nostr/index.d.ts +30 -0
  44. package/dist/channels/nostr/index.js +68 -0
  45. package/dist/channels/nostr/index.js.map +1 -0
  46. package/dist/channels/twilio-voice/index.d.ts +37 -0
  47. package/dist/channels/twilio-voice/index.js +76 -0
  48. package/dist/channels/twilio-voice/index.js.map +1 -0
  49. package/dist/channels/whatsapp/index.js +0 -1
  50. package/dist/channels/whatsapp/index.js.map +1 -1
  51. package/dist/channels/zalo/index.d.ts +28 -0
  52. package/dist/channels/zalo/index.js +53 -0
  53. package/dist/channels/zalo/index.js.map +1 -0
  54. package/dist/cloud/cloud-sessions.d.ts +56 -0
  55. package/dist/cloud/cloud-sessions.js +187 -0
  56. package/dist/cloud/cloud-sessions.js.map +1 -0
  57. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  58. package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
  59. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  60. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  61. package/dist/codebuddy/tool-definitions/index.js +1 -1
  62. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  63. package/dist/commands/handlers/auth-handler.d.ts +32 -0
  64. package/dist/commands/handlers/auth-handler.js +137 -0
  65. package/dist/commands/handlers/auth-handler.js.map +1 -0
  66. package/dist/commands/handlers/context-handler.d.ts +46 -0
  67. package/dist/commands/handlers/context-handler.js +102 -0
  68. package/dist/commands/handlers/context-handler.js.map +1 -0
  69. package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
  70. package/dist/commands/handlers/keybindings-handler.js +124 -0
  71. package/dist/commands/handlers/keybindings-handler.js.map +1 -0
  72. package/dist/commands/handlers/session-commands.d.ts +17 -0
  73. package/dist/commands/handlers/session-commands.js +119 -0
  74. package/dist/commands/handlers/session-commands.js.map +1 -0
  75. package/dist/commands/slash/builtin-commands.js +1 -1
  76. package/dist/commands/slash/builtin-commands.js.map +1 -1
  77. package/dist/config/admin-config.d.ts +54 -0
  78. package/dist/config/admin-config.js +144 -0
  79. package/dist/config/admin-config.js.map +1 -0
  80. package/dist/config/advanced-config.d.ts +118 -0
  81. package/dist/config/advanced-config.js +364 -0
  82. package/dist/config/advanced-config.js.map +1 -0
  83. package/dist/config/managed-policies.d.ts +50 -0
  84. package/dist/config/managed-policies.js +120 -0
  85. package/dist/config/managed-policies.js.map +1 -0
  86. package/dist/config/settings-hierarchy.d.ts +59 -0
  87. package/dist/config/settings-hierarchy.js +188 -0
  88. package/dist/config/settings-hierarchy.js.map +1 -0
  89. package/dist/config/tool-profiles.d.ts +37 -0
  90. package/dist/config/tool-profiles.js +150 -0
  91. package/dist/config/tool-profiles.js.map +1 -0
  92. package/dist/config/user-settings.d.ts +31 -0
  93. package/dist/config/user-settings.js +66 -0
  94. package/dist/config/user-settings.js.map +1 -0
  95. package/dist/context/context-files.d.ts +1 -1
  96. package/dist/context/context-files.js +2 -2
  97. package/dist/context/context-files.js.map +1 -1
  98. package/dist/context/partial-summarizer.d.ts +32 -0
  99. package/dist/context/partial-summarizer.js +144 -0
  100. package/dist/context/partial-summarizer.js.map +1 -0
  101. package/dist/desktop/desktop-app.d.ts +44 -0
  102. package/dist/desktop/desktop-app.js +136 -0
  103. package/dist/desktop/desktop-app.js.map +1 -0
  104. package/dist/git/worktree-sessions.d.ts +24 -0
  105. package/dist/git/worktree-sessions.js +93 -0
  106. package/dist/git/worktree-sessions.js.map +1 -0
  107. package/dist/hooks/advanced-hooks.d.ts +110 -0
  108. package/dist/hooks/advanced-hooks.js +256 -0
  109. package/dist/hooks/advanced-hooks.js.map +1 -0
  110. package/dist/hooks/async-hooks.d.ts +73 -0
  111. package/dist/hooks/async-hooks.js +213 -0
  112. package/dist/hooks/async-hooks.js.map +1 -0
  113. package/dist/hooks/env-persistence.d.ts +58 -0
  114. package/dist/hooks/env-persistence.js +195 -0
  115. package/dist/hooks/env-persistence.js.map +1 -0
  116. package/dist/hooks/hook-events.d.ts +36 -0
  117. package/dist/hooks/hook-events.js +55 -0
  118. package/dist/hooks/hook-events.js.map +1 -0
  119. package/dist/hooks/smart-hooks.d.ts +85 -0
  120. package/dist/hooks/smart-hooks.js +199 -0
  121. package/dist/hooks/smart-hooks.js.map +1 -0
  122. package/dist/ide/jetbrains-plugin.d.ts +55 -0
  123. package/dist/ide/jetbrains-plugin.js +156 -0
  124. package/dist/ide/jetbrains-plugin.js.map +1 -0
  125. package/dist/ide/vscode-extension.d.ts +94 -0
  126. package/dist/ide/vscode-extension.js +229 -0
  127. package/dist/ide/vscode-extension.js.map +1 -0
  128. package/dist/index.js +77 -3
  129. package/dist/index.js.map +1 -1
  130. package/dist/input/file-autocomplete.d.ts +42 -0
  131. package/dist/input/file-autocomplete.js +154 -0
  132. package/dist/input/file-autocomplete.js.map +1 -0
  133. package/dist/integrations/chrome-bridge.d.ts +90 -0
  134. package/dist/integrations/chrome-bridge.js +151 -0
  135. package/dist/integrations/chrome-bridge.js.map +1 -0
  136. package/dist/integrations/github-action-runner.d.ts +40 -0
  137. package/dist/integrations/github-action-runner.js +163 -0
  138. package/dist/integrations/github-action-runner.js.map +1 -0
  139. package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
  140. package/dist/integrations/gitlab-ci-runner.js +104 -0
  141. package/dist/integrations/gitlab-ci-runner.js.map +1 -0
  142. package/dist/integrations/pr-session-linker.d.ts +44 -0
  143. package/dist/integrations/pr-session-linker.js +103 -0
  144. package/dist/integrations/pr-session-linker.js.map +1 -0
  145. package/dist/integrations/tailscale.d.ts +36 -0
  146. package/dist/integrations/tailscale.js +101 -0
  147. package/dist/integrations/tailscale.js.map +1 -0
  148. package/dist/lsp/lsp-client.d.ts +68 -0
  149. package/dist/lsp/lsp-client.js +182 -0
  150. package/dist/lsp/lsp-client.js.map +1 -0
  151. package/dist/mcp/connectors.d.ts +28 -0
  152. package/dist/mcp/connectors.js +148 -0
  153. package/dist/mcp/connectors.js.map +1 -0
  154. package/dist/mcp/index.d.ts +7 -4
  155. package/dist/mcp/index.js +7 -4
  156. package/dist/mcp/index.js.map +1 -1
  157. package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
  158. package/dist/mcp/mcp-auto-discovery.js +104 -0
  159. package/dist/mcp/mcp-auto-discovery.js.map +1 -0
  160. package/dist/mcp/mcp-server.d.ts +70 -0
  161. package/dist/mcp/mcp-server.js +374 -0
  162. package/dist/mcp/mcp-server.js.map +1 -0
  163. package/dist/memory/auto-memory.d.ts +53 -0
  164. package/dist/memory/auto-memory.js +250 -0
  165. package/dist/memory/auto-memory.js.map +1 -0
  166. package/dist/memory/hybrid-search.d.ts +51 -0
  167. package/dist/memory/hybrid-search.js +199 -0
  168. package/dist/memory/hybrid-search.js.map +1 -0
  169. package/dist/memory/memory-flush.d.ts +51 -0
  170. package/dist/memory/memory-flush.js +102 -0
  171. package/dist/memory/memory-flush.js.map +1 -0
  172. package/dist/memory/subagent-memory.d.ts +73 -0
  173. package/dist/memory/subagent-memory.js +172 -0
  174. package/dist/memory/subagent-memory.js.map +1 -0
  175. package/dist/nodes/device-node.d.ts +40 -0
  176. package/dist/nodes/device-node.js +117 -0
  177. package/dist/nodes/device-node.js.map +1 -0
  178. package/dist/output/json-schema-output.d.ts +67 -0
  179. package/dist/output/json-schema-output.js +273 -0
  180. package/dist/output/json-schema-output.js.map +1 -0
  181. package/dist/persistence/session-picker.d.ts +22 -0
  182. package/dist/persistence/session-picker.js +47 -0
  183. package/dist/persistence/session-picker.js.map +1 -0
  184. package/dist/persistence/session-store.d.ts +11 -0
  185. package/dist/persistence/session-store.js +17 -0
  186. package/dist/persistence/session-store.js.map +1 -1
  187. package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
  188. package/dist/plugins/git-pinned-marketplace.js +152 -0
  189. package/dist/plugins/git-pinned-marketplace.js.map +1 -0
  190. package/dist/plugins/plugin-manifest.d.ts +116 -0
  191. package/dist/plugins/plugin-manifest.js +283 -0
  192. package/dist/plugins/plugin-manifest.js.map +1 -0
  193. package/dist/sandbox/os-sandbox.d.ts +49 -1
  194. package/dist/sandbox/os-sandbox.js +347 -6
  195. package/dist/sandbox/os-sandbox.js.map +1 -1
  196. package/dist/sdk/agent-sdk.d.ts +61 -0
  197. package/dist/sdk/agent-sdk.js +90 -0
  198. package/dist/sdk/agent-sdk.js.map +1 -0
  199. package/dist/security/permission-modes.d.ts +76 -0
  200. package/dist/security/permission-modes.js +195 -0
  201. package/dist/security/permission-modes.js.map +1 -0
  202. package/dist/security/permission-patterns.d.ts +61 -0
  203. package/dist/security/permission-patterns.js +171 -0
  204. package/dist/security/permission-patterns.js.map +1 -0
  205. package/dist/security/safe-binaries.d.ts +23 -0
  206. package/dist/security/safe-binaries.js +96 -0
  207. package/dist/security/safe-binaries.js.map +1 -0
  208. package/dist/security/sender-policies.d.ts +46 -0
  209. package/dist/security/sender-policies.js +90 -0
  210. package/dist/security/sender-policies.js.map +1 -0
  211. package/dist/server/dashboard.d.ts +53 -0
  212. package/dist/server/dashboard.js +93 -0
  213. package/dist/server/dashboard.js.map +1 -0
  214. package/dist/services/system-prompt-override.d.ts +34 -0
  215. package/dist/services/system-prompt-override.js +64 -0
  216. package/dist/services/system-prompt-override.js.map +1 -0
  217. package/dist/skills/skill-enhancements.d.ts +37 -0
  218. package/dist/skills/skill-enhancements.js +69 -0
  219. package/dist/skills/skill-enhancements.js.map +1 -0
  220. package/dist/telemetry/otel-tracer.d.ts +98 -0
  221. package/dist/telemetry/otel-tracer.js +245 -0
  222. package/dist/telemetry/otel-tracer.js.map +1 -0
  223. package/dist/tools/browser-stub.d.ts +61 -0
  224. package/dist/tools/browser-stub.js +184 -0
  225. package/dist/tools/browser-stub.js.map +1 -0
  226. package/dist/tools/gateway-tool.d.ts +43 -0
  227. package/dist/tools/gateway-tool.js +92 -0
  228. package/dist/tools/gateway-tool.js.map +1 -0
  229. package/dist/tools/image-stub.d.ts +32 -0
  230. package/dist/tools/image-stub.js +97 -0
  231. package/dist/tools/image-stub.js.map +1 -0
  232. package/dist/tools/js-repl.d.ts +78 -0
  233. package/dist/tools/js-repl.js +280 -0
  234. package/dist/tools/js-repl.js.map +1 -0
  235. package/dist/tools/message-tool.d.ts +42 -0
  236. package/dist/tools/message-tool.js +113 -0
  237. package/dist/tools/message-tool.js.map +1 -0
  238. package/dist/ui/cli-enhancements.d.ts +178 -0
  239. package/dist/ui/cli-enhancements.js +430 -0
  240. package/dist/ui/cli-enhancements.js.map +1 -0
  241. package/dist/ui/status-line.d.ts +90 -0
  242. package/dist/ui/status-line.js +160 -0
  243. package/dist/ui/status-line.js.map +1 -0
  244. package/dist/ui/terminal-enhancements.d.ts +34 -0
  245. package/dist/ui/terminal-enhancements.js +97 -0
  246. package/dist/ui/terminal-enhancements.js.map +1 -0
  247. package/dist/ui/ui-enhancements.d.ts +38 -0
  248. package/dist/ui/ui-enhancements.js +116 -0
  249. package/dist/ui/ui-enhancements.js.map +1 -0
  250. package/dist/utils/custom-instructions.js +4 -1
  251. package/dist/utils/custom-instructions.js.map +1 -1
  252. package/dist/utils/init-project.d.ts +1 -1
  253. package/dist/utils/init-project.js +20 -20
  254. package/dist/utils/init-project.js.map +1 -1
  255. package/dist/utils/output-schema-validator.d.ts +40 -0
  256. package/dist/utils/output-schema-validator.js +137 -0
  257. package/dist/utils/output-schema-validator.js.map +1 -0
  258. package/dist/utils/safety-misc.d.ts +24 -0
  259. package/dist/utils/safety-misc.js +91 -0
  260. package/dist/utils/safety-misc.js.map +1 -0
  261. package/dist/utils/session-enhancements.d.ts +40 -0
  262. package/dist/utils/session-enhancements.js +118 -0
  263. package/dist/utils/session-enhancements.js.map +1 -0
  264. package/dist/utils/shell-snapshot.d.ts +38 -0
  265. package/dist/utils/shell-snapshot.js +323 -0
  266. package/dist/utils/shell-snapshot.js.map +1 -0
  267. package/dist/utils/stream-json-formatter.d.ts +77 -0
  268. package/dist/utils/stream-json-formatter.js +61 -0
  269. package/dist/utils/stream-json-formatter.js.map +1 -0
  270. package/dist/workflows/lobster-engine.d.ts +43 -0
  271. package/dist/workflows/lobster-engine.js +167 -0
  272. package/dist/workflows/lobster-engine.js.map +1 -0
  273. 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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA8B5C,MAAM,cAAc,GAAoB;IACtC,gBAAgB,EAAE,IAAI;IACtB,sBAAsB,EAAE,IAAI;IAC5B,uBAAuB,EAAE,IAAI;IAC7B,mBAAmB,EAAE,cAAc;IACnC,aAAa,EAAE;QACb,eAAe;QACf,SAAS;QACT,UAAU;QACV,QAAQ;QACR,UAAU;QACV,OAAO;QACP,OAAO;QACP,UAAU;QACV,UAAU;QACV,gBAAgB;KACjB;CACF,CAAC;AAEF,MAAM,OAAO,eAAe;IAClB,MAAM,CAAkB;IACxB,KAAK,CAA6B;IAClC,gBAAgB,CAAoB;IACpC,WAAW,CAAqB;IAExC,YAAY,MAAiC;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,MAAc,EAAE,KAAa;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,UAAuC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,UAAU,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,IAAY;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,IAAI;YACJ,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,mBAAmB;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,IAAY;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;IAED,sBAAsB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACzC,CAAC;IAED,sBAAsB,CAAC,QAAgB;QACrC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,gBAAgB;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CACnC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAC3D,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO;;;;;;;;;;;;;;;;;gEAiBqD,IAAI,CAAC,MAAM,CAAC,mBAAmB;;;;;;;eAOhF,CAAC;IACd,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -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
- render(React.createElement(ChatInterface, { agent, initialMessage }));
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