gencode-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# Proposal: IDE Integrations
|
|
2
|
+
|
|
3
|
+
- **Proposal ID**: 0032
|
|
4
|
+
- **Author**: mycode team
|
|
5
|
+
- **Status**: Draft
|
|
6
|
+
- **Created**: 2025-01-15
|
|
7
|
+
- **Updated**: 2025-01-15
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
Implement IDE integrations for VS Code, JetBrains IDEs, and other editors, allowing users to interact with mycode from within their development environment.
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
CLI-only usage has limitations:
|
|
16
|
+
|
|
17
|
+
1. **Context switching**: Switch between editor and terminal
|
|
18
|
+
2. **No visual integration**: Can't see code in context
|
|
19
|
+
3. **Limited selection**: Can't select code to discuss
|
|
20
|
+
4. **No inline suggestions**: Suggestions not in editor
|
|
21
|
+
5. **Workflow friction**: Extra steps for common tasks
|
|
22
|
+
|
|
23
|
+
IDE integrations enable seamless development workflows.
|
|
24
|
+
|
|
25
|
+
## Claude Code Reference
|
|
26
|
+
|
|
27
|
+
Claude Code offers VS Code integration:
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
- Sidebar panel for chat
|
|
31
|
+
- Code selection context
|
|
32
|
+
- Inline completions
|
|
33
|
+
- Terminal integration
|
|
34
|
+
- File context awareness
|
|
35
|
+
|
|
36
|
+
## Detailed Design
|
|
37
|
+
|
|
38
|
+
### API Design
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// src/ide/types.ts
|
|
42
|
+
interface IDEConnection {
|
|
43
|
+
id: string;
|
|
44
|
+
type: 'vscode' | 'jetbrains' | 'vim' | 'emacs';
|
|
45
|
+
version: string;
|
|
46
|
+
capabilities: string[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface IDEMessage {
|
|
50
|
+
type: 'request' | 'response' | 'event';
|
|
51
|
+
id: string;
|
|
52
|
+
method: string;
|
|
53
|
+
params?: unknown;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface CodeContext {
|
|
57
|
+
filePath: string;
|
|
58
|
+
language: string;
|
|
59
|
+
selection?: {
|
|
60
|
+
start: { line: number; character: number };
|
|
61
|
+
end: { line: number; character: number };
|
|
62
|
+
text: string;
|
|
63
|
+
};
|
|
64
|
+
visibleRange?: {
|
|
65
|
+
start: number;
|
|
66
|
+
end: number;
|
|
67
|
+
};
|
|
68
|
+
diagnostics?: Diagnostic[];
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### IDE Server
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// src/ide/server.ts
|
|
76
|
+
class IDEServer {
|
|
77
|
+
private connections: Map<string, IDEConnection> = new Map();
|
|
78
|
+
private wss: WebSocketServer;
|
|
79
|
+
|
|
80
|
+
constructor(port: number = 9876) {
|
|
81
|
+
this.wss = new WebSocketServer({ port });
|
|
82
|
+
this.setupHandlers();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private setupHandlers(): void {
|
|
86
|
+
this.wss.on('connection', (ws) => {
|
|
87
|
+
const id = generateId();
|
|
88
|
+
|
|
89
|
+
ws.on('message', async (data) => {
|
|
90
|
+
const message = JSON.parse(data.toString()) as IDEMessage;
|
|
91
|
+
const response = await this.handleMessage(id, message);
|
|
92
|
+
ws.send(JSON.stringify(response));
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
ws.on('close', () => {
|
|
96
|
+
this.connections.delete(id);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private async handleMessage(
|
|
102
|
+
connectionId: string,
|
|
103
|
+
message: IDEMessage
|
|
104
|
+
): Promise<IDEMessage> {
|
|
105
|
+
switch (message.method) {
|
|
106
|
+
case 'initialize':
|
|
107
|
+
return this.handleInitialize(connectionId, message);
|
|
108
|
+
case 'chat':
|
|
109
|
+
return this.handleChat(connectionId, message);
|
|
110
|
+
case 'complete':
|
|
111
|
+
return this.handleComplete(connectionId, message);
|
|
112
|
+
case 'explain':
|
|
113
|
+
return this.handleExplain(connectionId, message);
|
|
114
|
+
case 'fix':
|
|
115
|
+
return this.handleFix(connectionId, message);
|
|
116
|
+
default:
|
|
117
|
+
return {
|
|
118
|
+
type: 'response',
|
|
119
|
+
id: message.id,
|
|
120
|
+
method: 'error',
|
|
121
|
+
params: { error: 'Unknown method' }
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private async handleChat(
|
|
127
|
+
connectionId: string,
|
|
128
|
+
message: IDEMessage
|
|
129
|
+
): Promise<IDEMessage> {
|
|
130
|
+
const { prompt, context } = message.params as {
|
|
131
|
+
prompt: string;
|
|
132
|
+
context?: CodeContext;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Build context-aware prompt
|
|
136
|
+
let fullPrompt = prompt;
|
|
137
|
+
if (context?.selection?.text) {
|
|
138
|
+
fullPrompt = `Regarding this code:\n\`\`\`${context.language}\n${context.selection.text}\n\`\`\`\n\n${prompt}`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Run agent
|
|
142
|
+
const response = await this.runAgent(fullPrompt, context);
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
type: 'response',
|
|
146
|
+
id: message.id,
|
|
147
|
+
method: 'chat',
|
|
148
|
+
params: { response }
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### VS Code Extension
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// vscode-extension/src/extension.ts
|
|
158
|
+
import * as vscode from 'vscode';
|
|
159
|
+
|
|
160
|
+
let connection: WebSocket | null = null;
|
|
161
|
+
|
|
162
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
163
|
+
// Register chat panel
|
|
164
|
+
const provider = new MycodeViewProvider(context.extensionUri);
|
|
165
|
+
context.subscriptions.push(
|
|
166
|
+
vscode.window.registerWebviewViewProvider('mycode.chatView', provider)
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Register commands
|
|
170
|
+
context.subscriptions.push(
|
|
171
|
+
vscode.commands.registerCommand('mycode.explain', explainSelection),
|
|
172
|
+
vscode.commands.registerCommand('mycode.fix', fixSelection),
|
|
173
|
+
vscode.commands.registerCommand('mycode.chat', openChat),
|
|
174
|
+
vscode.commands.registerCommand('mycode.terminal', openTerminal)
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
// Connect to mycode server
|
|
178
|
+
connectToServer();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function explainSelection() {
|
|
182
|
+
const editor = vscode.window.activeTextEditor;
|
|
183
|
+
if (!editor) return;
|
|
184
|
+
|
|
185
|
+
const selection = editor.document.getText(editor.selection);
|
|
186
|
+
const language = editor.document.languageId;
|
|
187
|
+
|
|
188
|
+
const response = await sendMessage('explain', {
|
|
189
|
+
code: selection,
|
|
190
|
+
language,
|
|
191
|
+
filePath: editor.document.uri.fsPath
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
showResponse(response);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async function fixSelection() {
|
|
198
|
+
const editor = vscode.window.activeTextEditor;
|
|
199
|
+
if (!editor) return;
|
|
200
|
+
|
|
201
|
+
const diagnostics = vscode.languages.getDiagnostics(editor.document.uri);
|
|
202
|
+
const selection = editor.document.getText(editor.selection);
|
|
203
|
+
|
|
204
|
+
const response = await sendMessage('fix', {
|
|
205
|
+
code: selection,
|
|
206
|
+
language: editor.document.languageId,
|
|
207
|
+
diagnostics: diagnostics.map(d => ({
|
|
208
|
+
message: d.message,
|
|
209
|
+
severity: d.severity,
|
|
210
|
+
range: d.range
|
|
211
|
+
}))
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
if (response.fix) {
|
|
215
|
+
await editor.edit(builder => {
|
|
216
|
+
builder.replace(editor.selection, response.fix);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
class MycodeViewProvider implements vscode.WebviewViewProvider {
|
|
222
|
+
resolveWebviewView(webviewView: vscode.WebviewView) {
|
|
223
|
+
webviewView.webview.html = this.getHtml();
|
|
224
|
+
|
|
225
|
+
webviewView.webview.onDidReceiveMessage(async (message) => {
|
|
226
|
+
if (message.type === 'chat') {
|
|
227
|
+
const context = this.getEditorContext();
|
|
228
|
+
const response = await sendMessage('chat', {
|
|
229
|
+
prompt: message.prompt,
|
|
230
|
+
context
|
|
231
|
+
});
|
|
232
|
+
webviewView.webview.postMessage({ type: 'response', content: response });
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### File Changes
|
|
240
|
+
|
|
241
|
+
| File | Action | Description |
|
|
242
|
+
|------|--------|-------------|
|
|
243
|
+
| `src/ide/types.ts` | Create | Type definitions |
|
|
244
|
+
| `src/ide/server.ts` | Create | WebSocket server |
|
|
245
|
+
| `src/ide/handlers/*.ts` | Create | Request handlers |
|
|
246
|
+
| `src/ide/index.ts` | Create | Module exports |
|
|
247
|
+
| `vscode-extension/` | Create | VS Code extension |
|
|
248
|
+
| `jetbrains-plugin/` | Create | JetBrains plugin |
|
|
249
|
+
|
|
250
|
+
## User Experience
|
|
251
|
+
|
|
252
|
+
### VS Code Sidebar
|
|
253
|
+
```
|
|
254
|
+
┌─ mycode ───────────────────────────────────┐
|
|
255
|
+
│ │
|
|
256
|
+
│ [Select code and ask questions] │
|
|
257
|
+
│ │
|
|
258
|
+
│ ┌────────────────────────────────────────┐ │
|
|
259
|
+
│ │ Type your question... │ │
|
|
260
|
+
│ └────────────────────────────────────────┘ │
|
|
261
|
+
│ │
|
|
262
|
+
│ Recent: │
|
|
263
|
+
│ • Explain this function │
|
|
264
|
+
│ • Fix the type error │
|
|
265
|
+
│ • Add error handling │
|
|
266
|
+
│ │
|
|
267
|
+
└────────────────────────────────────────────┘
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Context Menu
|
|
271
|
+
```
|
|
272
|
+
Right-click on selected code:
|
|
273
|
+
├─ mycode: Explain Selection
|
|
274
|
+
├─ mycode: Fix Issues
|
|
275
|
+
├─ mycode: Add Tests
|
|
276
|
+
├─ mycode: Refactor
|
|
277
|
+
└─ mycode: Ask...
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Keyboard Shortcuts
|
|
281
|
+
```
|
|
282
|
+
Ctrl+Shift+M Open mycode chat
|
|
283
|
+
Ctrl+Shift+E Explain selection
|
|
284
|
+
Ctrl+Shift+F Fix selection
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Alternatives Considered
|
|
288
|
+
|
|
289
|
+
### Alternative 1: Language Server
|
|
290
|
+
Implement as LSP server.
|
|
291
|
+
|
|
292
|
+
**Pros**: Standard protocol
|
|
293
|
+
**Cons**: Limited to LSP capabilities
|
|
294
|
+
**Decision**: WebSocket for flexibility
|
|
295
|
+
|
|
296
|
+
### Alternative 2: Editor Plugins Only
|
|
297
|
+
No server, direct API calls.
|
|
298
|
+
|
|
299
|
+
**Pros**: Simpler architecture
|
|
300
|
+
**Cons**: No session sharing
|
|
301
|
+
**Decision**: Server enables session persistence
|
|
302
|
+
|
|
303
|
+
## Security Considerations
|
|
304
|
+
|
|
305
|
+
1. Local-only connections
|
|
306
|
+
2. Authentication tokens
|
|
307
|
+
3. No remote code execution
|
|
308
|
+
4. Sandboxed extension
|
|
309
|
+
|
|
310
|
+
## Testing Strategy
|
|
311
|
+
|
|
312
|
+
1. Unit tests for server
|
|
313
|
+
2. Extension integration tests
|
|
314
|
+
3. Manual UX testing
|
|
315
|
+
|
|
316
|
+
## Migration Path
|
|
317
|
+
|
|
318
|
+
1. **Phase 1**: VS Code extension
|
|
319
|
+
2. **Phase 2**: JetBrains plugin
|
|
320
|
+
3. **Phase 3**: Vim/Neovim plugin
|
|
321
|
+
4. **Phase 4**: Emacs package
|
|
322
|
+
5. **Phase 5**: LSP server mode
|
|
323
|
+
|
|
324
|
+
## References
|
|
325
|
+
|
|
326
|
+
- [VS Code Extension API](https://code.visualstudio.com/api)
|
|
327
|
+
- [IntelliJ Plugin Development](https://plugins.jetbrains.com/docs/intellij/)
|
|
328
|
+
- [Language Server Protocol](https://microsoft.github.io/language-server-protocol/)
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Proposal: Enterprise Deployment
|
|
2
|
+
|
|
3
|
+
- **Proposal ID**: 0033
|
|
4
|
+
- **Author**: mycode team
|
|
5
|
+
- **Status**: Draft
|
|
6
|
+
- **Created**: 2025-01-15
|
|
7
|
+
- **Updated**: 2025-01-15
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
Implement enterprise deployment features including centralized configuration, SSO authentication, audit logging, and policy management for organizational deployments of mycode.
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
Enterprise environments have unique requirements:
|
|
16
|
+
|
|
17
|
+
1. **Centralized config**: Organization-wide settings
|
|
18
|
+
2. **Authentication**: SSO/SAML integration
|
|
19
|
+
3. **Audit logging**: Compliance requirements
|
|
20
|
+
4. **Policy enforcement**: Usage restrictions
|
|
21
|
+
5. **License management**: Seat-based licensing
|
|
22
|
+
|
|
23
|
+
Enterprise features enable organizational adoption.
|
|
24
|
+
|
|
25
|
+
## Detailed Design
|
|
26
|
+
|
|
27
|
+
### API Design
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// src/enterprise/types.ts
|
|
31
|
+
interface EnterpriseConfig {
|
|
32
|
+
orgId: string;
|
|
33
|
+
configUrl?: string;
|
|
34
|
+
sso?: SSOConfig;
|
|
35
|
+
policies: PolicyConfig;
|
|
36
|
+
audit: AuditConfig;
|
|
37
|
+
features: FeatureFlags;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface SSOConfig {
|
|
41
|
+
provider: 'saml' | 'oidc' | 'ldap';
|
|
42
|
+
issuer: string;
|
|
43
|
+
clientId: string;
|
|
44
|
+
redirectUri: string;
|
|
45
|
+
scopes: string[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface PolicyConfig {
|
|
49
|
+
allowedProviders: string[];
|
|
50
|
+
allowedModels: string[];
|
|
51
|
+
maxTokensPerDay?: number;
|
|
52
|
+
blockedTools?: string[];
|
|
53
|
+
requireApproval?: string[];
|
|
54
|
+
dataRetention: number; // Days
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface AuditConfig {
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
destination: 'local' | 'remote' | 'siem';
|
|
60
|
+
endpoint?: string;
|
|
61
|
+
events: AuditEventType[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
type AuditEventType =
|
|
65
|
+
| 'session_start'
|
|
66
|
+
| 'session_end'
|
|
67
|
+
| 'tool_execution'
|
|
68
|
+
| 'message_sent'
|
|
69
|
+
| 'file_access'
|
|
70
|
+
| 'permission_granted';
|
|
71
|
+
|
|
72
|
+
interface AuditEvent {
|
|
73
|
+
timestamp: Date;
|
|
74
|
+
type: AuditEventType;
|
|
75
|
+
userId: string;
|
|
76
|
+
sessionId: string;
|
|
77
|
+
details: Record<string, unknown>;
|
|
78
|
+
ip?: string;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Enterprise Manager
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// src/enterprise/manager.ts
|
|
86
|
+
class EnterpriseManager {
|
|
87
|
+
private config: EnterpriseConfig | null = null;
|
|
88
|
+
private authenticated: boolean = false;
|
|
89
|
+
|
|
90
|
+
async initialize(): Promise<void> {
|
|
91
|
+
// Check for enterprise config
|
|
92
|
+
const configPath = process.env.MYCODE_ENTERPRISE_CONFIG;
|
|
93
|
+
if (!configPath) return;
|
|
94
|
+
|
|
95
|
+
this.config = await this.loadConfig(configPath);
|
|
96
|
+
|
|
97
|
+
if (this.config.sso) {
|
|
98
|
+
await this.authenticateSSO();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async enforcePolicy(action: string, context: unknown): Promise<boolean> {
|
|
103
|
+
if (!this.config) return true;
|
|
104
|
+
|
|
105
|
+
const policies = this.config.policies;
|
|
106
|
+
|
|
107
|
+
// Check provider restrictions
|
|
108
|
+
if (action === 'use_provider') {
|
|
109
|
+
const provider = context as string;
|
|
110
|
+
if (!policies.allowedProviders.includes(provider)) {
|
|
111
|
+
throw new Error(`Provider ${provider} not allowed by policy`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Check tool restrictions
|
|
116
|
+
if (action === 'execute_tool') {
|
|
117
|
+
const tool = (context as { tool: string }).tool;
|
|
118
|
+
if (policies.blockedTools?.includes(tool)) {
|
|
119
|
+
throw new Error(`Tool ${tool} blocked by policy`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async logAudit(event: AuditEvent): Promise<void> {
|
|
127
|
+
if (!this.config?.audit.enabled) return;
|
|
128
|
+
|
|
129
|
+
switch (this.config.audit.destination) {
|
|
130
|
+
case 'local':
|
|
131
|
+
await this.logLocal(event);
|
|
132
|
+
break;
|
|
133
|
+
case 'remote':
|
|
134
|
+
await this.logRemote(event);
|
|
135
|
+
break;
|
|
136
|
+
case 'siem':
|
|
137
|
+
await this.logSIEM(event);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private async authenticateSSO(): Promise<void> {
|
|
143
|
+
const sso = this.config!.sso!;
|
|
144
|
+
|
|
145
|
+
switch (sso.provider) {
|
|
146
|
+
case 'oidc':
|
|
147
|
+
await this.authenticateOIDC(sso);
|
|
148
|
+
break;
|
|
149
|
+
case 'saml':
|
|
150
|
+
await this.authenticateSAML(sso);
|
|
151
|
+
break;
|
|
152
|
+
case 'ldap':
|
|
153
|
+
await this.authenticateLDAP(sso);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export const enterpriseManager = new EnterpriseManager();
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### File Changes
|
|
163
|
+
|
|
164
|
+
| File | Action | Description |
|
|
165
|
+
|------|--------|-------------|
|
|
166
|
+
| `src/enterprise/types.ts` | Create | Type definitions |
|
|
167
|
+
| `src/enterprise/manager.ts` | Create | Enterprise management |
|
|
168
|
+
| `src/enterprise/auth/*.ts` | Create | SSO providers |
|
|
169
|
+
| `src/enterprise/audit.ts` | Create | Audit logging |
|
|
170
|
+
| `src/enterprise/policy.ts` | Create | Policy enforcement |
|
|
171
|
+
|
|
172
|
+
## User Experience
|
|
173
|
+
|
|
174
|
+
### Enterprise Login
|
|
175
|
+
```
|
|
176
|
+
$ mycode
|
|
177
|
+
|
|
178
|
+
Enterprise Mode: Acme Corp
|
|
179
|
+
Authenticating via SSO...
|
|
180
|
+
|
|
181
|
+
Opening browser for authentication...
|
|
182
|
+
✓ Authenticated as john.doe@acme.com
|
|
183
|
+
|
|
184
|
+
Session policies:
|
|
185
|
+
- Allowed providers: anthropic, openai
|
|
186
|
+
- Daily token limit: 100,000
|
|
187
|
+
- Audit logging: enabled
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Policy Violation
|
|
191
|
+
```
|
|
192
|
+
Agent: [Bash: rm -rf /tmp/data]
|
|
193
|
+
|
|
194
|
+
⚠️ Policy Violation
|
|
195
|
+
|
|
196
|
+
This operation is blocked by organization policy.
|
|
197
|
+
Reason: Bash tool restricted for security
|
|
198
|
+
|
|
199
|
+
Contact your administrator for access.
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Security Considerations
|
|
203
|
+
|
|
204
|
+
1. Secure config transmission
|
|
205
|
+
2. Token encryption
|
|
206
|
+
3. Audit log integrity
|
|
207
|
+
4. Policy tampering prevention
|
|
208
|
+
5. Session isolation
|
|
209
|
+
|
|
210
|
+
## Migration Path
|
|
211
|
+
|
|
212
|
+
1. **Phase 1**: Centralized config
|
|
213
|
+
2. **Phase 2**: SSO authentication
|
|
214
|
+
3. **Phase 3**: Policy enforcement
|
|
215
|
+
4. **Phase 4**: Audit logging
|
|
216
|
+
5. **Phase 5**: SIEM integration
|
|
217
|
+
|
|
218
|
+
## References
|
|
219
|
+
|
|
220
|
+
- [OIDC Specification](https://openid.net/connect/)
|
|
221
|
+
- [SAML 2.0](https://docs.oasis-open.org/security/saml/v2.0/)
|