@quantiya/codevibe-claude-plugin 1.0.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.
Files changed (64) hide show
  1. package/.claude-plugin/plugin.json +22 -0
  2. package/.env.example +28 -0
  3. package/LICENSE +21 -0
  4. package/README.md +301 -0
  5. package/bin/claude-companion-setup +65 -0
  6. package/bin/codevibe-claude +134 -0
  7. package/dist/appsync-client.d.ts +67 -0
  8. package/dist/appsync-client.d.ts.map +1 -0
  9. package/dist/appsync-client.js +858 -0
  10. package/dist/appsync-client.js.map +1 -0
  11. package/dist/auth-cli.d.ts +18 -0
  12. package/dist/auth-cli.d.ts.map +1 -0
  13. package/dist/auth-cli.js +472 -0
  14. package/dist/auth-cli.js.map +1 -0
  15. package/dist/command-executor.d.ts +20 -0
  16. package/dist/command-executor.d.ts.map +1 -0
  17. package/dist/command-executor.js +127 -0
  18. package/dist/command-executor.js.map +1 -0
  19. package/dist/config.d.ts +25 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +106 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/crypto-service.d.ts +115 -0
  24. package/dist/crypto-service.d.ts.map +1 -0
  25. package/dist/crypto-service.js +278 -0
  26. package/dist/crypto-service.js.map +1 -0
  27. package/dist/http-api.d.ts +35 -0
  28. package/dist/http-api.d.ts.map +1 -0
  29. package/dist/http-api.js +334 -0
  30. package/dist/http-api.js.map +1 -0
  31. package/dist/key-manager.d.ts +87 -0
  32. package/dist/key-manager.d.ts.map +1 -0
  33. package/dist/key-manager.js +287 -0
  34. package/dist/key-manager.js.map +1 -0
  35. package/dist/logger.d.ts +2 -0
  36. package/dist/logger.d.ts.map +1 -0
  37. package/dist/logger.js +18 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/prompt-responder.d.ts +22 -0
  40. package/dist/prompt-responder.d.ts.map +1 -0
  41. package/dist/prompt-responder.js +132 -0
  42. package/dist/prompt-responder.js.map +1 -0
  43. package/dist/server.d.ts +2 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +1154 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/token-storage.d.ts +39 -0
  48. package/dist/token-storage.d.ts.map +1 -0
  49. package/dist/token-storage.js +169 -0
  50. package/dist/token-storage.js.map +1 -0
  51. package/dist/types.d.ts +110 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +17 -0
  54. package/dist/types.js.map +1 -0
  55. package/hooks/common.sh +121 -0
  56. package/hooks/hooks.json +81 -0
  57. package/hooks/notification.sh +32 -0
  58. package/hooks/permission-request.sh +191 -0
  59. package/hooks/post-tool-use.sh +42 -0
  60. package/hooks/session-end.sh +57 -0
  61. package/hooks/session-start.sh +127 -0
  62. package/hooks/stop.sh +255 -0
  63. package/hooks/user-prompt.sh +32 -0
  64. package/package.json +70 -0
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ //
3
+ // key-manager.ts
4
+ // CodeVibe Claude Plugin
5
+ //
6
+ // Manages device encryption keys and session keys for E2E encryption
7
+ //
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.keyManager = exports.KeyManager = exports.KeyManagerError = void 0;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const os = __importStar(require("os"));
46
+ const uuid_1 = require("uuid");
47
+ const crypto_service_1 = require("./crypto-service");
48
+ const logger_1 = require("./logger");
49
+ // Errors that can occur during key management
50
+ class KeyManagerError extends Error {
51
+ constructor(message) {
52
+ super(message);
53
+ this.name = 'KeyManagerError';
54
+ }
55
+ }
56
+ exports.KeyManagerError = KeyManagerError;
57
+ // Storage directory for keys
58
+ const CONFIG_DIR = path.join(os.homedir(), '.codevibe-claude');
59
+ const DEVICE_KEY_FILE = 'device-key.json';
60
+ /**
61
+ * Manages device and session encryption keys
62
+ */
63
+ class KeyManager {
64
+ constructor() {
65
+ this.deviceKey = null;
66
+ this.sessionKeyCache = new Map(); // sessionId -> base64 session key
67
+ this.isRegistered = false;
68
+ this.ensureConfigDir();
69
+ this.loadDeviceKey();
70
+ }
71
+ static getInstance() {
72
+ if (!KeyManager.instance) {
73
+ KeyManager.instance = new KeyManager();
74
+ }
75
+ return KeyManager.instance;
76
+ }
77
+ // MARK: - Device Key Management
78
+ /**
79
+ * Get or generate the device ID
80
+ */
81
+ getDeviceId() {
82
+ if (this.deviceKey) {
83
+ return this.deviceKey.deviceId;
84
+ }
85
+ // Generate and store new device key if none exists
86
+ this.generateAndStoreDeviceKey();
87
+ return this.deviceKey.deviceId;
88
+ }
89
+ /**
90
+ * Get the current device's key pair, generating if needed
91
+ */
92
+ getOrCreateDeviceKeyPair() {
93
+ if (!this.deviceKey) {
94
+ this.generateAndStoreDeviceKey();
95
+ }
96
+ return {
97
+ privateKey: this.deviceKey.privateKey,
98
+ publicKey: this.deviceKey.publicKey,
99
+ };
100
+ }
101
+ /**
102
+ * Get the device's public key (base64)
103
+ */
104
+ getDevicePublicKey() {
105
+ const keyPair = this.getOrCreateDeviceKeyPair();
106
+ return keyPair.publicKey;
107
+ }
108
+ /**
109
+ * Check if we have a device key
110
+ */
111
+ hasDeviceKey() {
112
+ return this.deviceKey !== null;
113
+ }
114
+ /**
115
+ * Check if device key is registered with backend
116
+ */
117
+ getIsRegistered() {
118
+ return this.isRegistered;
119
+ }
120
+ /**
121
+ * Set registration status
122
+ */
123
+ setIsRegistered(registered) {
124
+ this.isRegistered = registered;
125
+ }
126
+ // MARK: - Session Key Management
127
+ /**
128
+ * Get session key for a session, decrypting from encryptedKeys if needed
129
+ */
130
+ getSessionKey(sessionId, encryptedKeys) {
131
+ // Check cache first
132
+ const cachedKey = this.sessionKeyCache.get(sessionId);
133
+ if (cachedKey) {
134
+ return cachedKey;
135
+ }
136
+ // Try to decrypt from encrypted keys
137
+ if (!encryptedKeys || encryptedKeys.length === 0) {
138
+ return null;
139
+ }
140
+ const deviceId = this.getDeviceId();
141
+ const ourEncryptedKey = encryptedKeys.find((k) => k.deviceId === deviceId);
142
+ if (!ourEncryptedKey) {
143
+ return null;
144
+ }
145
+ // Load our private key
146
+ if (!this.deviceKey) {
147
+ throw new KeyManagerError('Device key not found');
148
+ }
149
+ // Decrypt session key
150
+ const sessionKey = crypto_service_1.cryptoService.decryptSessionKey(ourEncryptedKey, this.deviceKey.privateKey);
151
+ // Cache for future use
152
+ this.sessionKeyCache.set(sessionId, sessionKey);
153
+ return sessionKey;
154
+ }
155
+ /**
156
+ * Generate and encrypt a new session key for all devices
157
+ */
158
+ createSessionKey(devicePublicKeys) {
159
+ // Generate random session key
160
+ const sessionKey = crypto_service_1.cryptoService.generateSessionKey();
161
+ // Encrypt for each device
162
+ const encryptedKeys = devicePublicKeys.map((device) => {
163
+ const encrypted = crypto_service_1.cryptoService.encryptSessionKey(sessionKey, device.publicKey);
164
+ return {
165
+ deviceId: device.deviceId,
166
+ encryptedKey: encrypted.encryptedKey,
167
+ ephemeralPublicKey: encrypted.ephemeralPublicKey,
168
+ };
169
+ });
170
+ return { sessionKey, encryptedKeys };
171
+ }
172
+ /**
173
+ * Cache a session key (after successfully decrypting or creating)
174
+ */
175
+ cacheSessionKey(sessionId, sessionKey) {
176
+ this.sessionKeyCache.set(sessionId, sessionKey);
177
+ }
178
+ /**
179
+ * Clear cached session key (on session end)
180
+ */
181
+ clearSessionKey(sessionId) {
182
+ this.sessionKeyCache.delete(sessionId);
183
+ }
184
+ /**
185
+ * Clear all cached session keys (on sign out)
186
+ */
187
+ clearAllSessionKeys() {
188
+ this.sessionKeyCache.clear();
189
+ }
190
+ // MARK: - Key Storage
191
+ ensureConfigDir() {
192
+ if (!fs.existsSync(CONFIG_DIR)) {
193
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
194
+ }
195
+ }
196
+ getKeyFilePath() {
197
+ return path.join(CONFIG_DIR, DEVICE_KEY_FILE);
198
+ }
199
+ loadDeviceKey() {
200
+ const keyFilePath = this.getKeyFilePath();
201
+ if (!fs.existsSync(keyFilePath)) {
202
+ this.deviceKey = null;
203
+ return;
204
+ }
205
+ try {
206
+ const data = fs.readFileSync(keyFilePath, 'utf8');
207
+ const stored = JSON.parse(data);
208
+ this.deviceKey = stored.device;
209
+ logger_1.logger.info(`[KeyManager] Loaded device key: ${this.deviceKey.deviceId}`);
210
+ }
211
+ catch (error) {
212
+ logger_1.logger.error(`[KeyManager] Failed to load device key: ${error}`);
213
+ this.deviceKey = null;
214
+ }
215
+ }
216
+ saveDeviceKey() {
217
+ if (!this.deviceKey) {
218
+ return;
219
+ }
220
+ const keyFilePath = this.getKeyFilePath();
221
+ const stored = {
222
+ device: this.deviceKey,
223
+ };
224
+ try {
225
+ fs.writeFileSync(keyFilePath, JSON.stringify(stored, null, 2), {
226
+ mode: 0o600, // Owner read/write only
227
+ });
228
+ logger_1.logger.info(`[KeyManager] Saved device key: ${this.deviceKey.deviceId}`);
229
+ }
230
+ catch (error) {
231
+ logger_1.logger.error(`[KeyManager] Failed to save device key: ${error}`);
232
+ throw new KeyManagerError(`Failed to save device key: ${error}`);
233
+ }
234
+ }
235
+ generateAndStoreDeviceKey() {
236
+ const keyPair = crypto_service_1.cryptoService.generateKeyPair();
237
+ const deviceId = (0, uuid_1.v4)().toUpperCase();
238
+ this.deviceKey = {
239
+ deviceId,
240
+ privateKey: keyPair.privateKey,
241
+ publicKey: keyPair.publicKey,
242
+ createdAt: new Date().toISOString(),
243
+ };
244
+ this.saveDeviceKey();
245
+ logger_1.logger.info(`[KeyManager] Generated new device key: ${deviceId}`);
246
+ }
247
+ // MARK: - Helpers
248
+ /**
249
+ * Get device name for registration
250
+ */
251
+ getDeviceName() {
252
+ return os.hostname() || 'CLI Client';
253
+ }
254
+ /**
255
+ * Get platform for registration
256
+ */
257
+ getDevicePlatform() {
258
+ const platform = os.platform();
259
+ if (platform === 'darwin') {
260
+ return 'MACOS';
261
+ }
262
+ else if (platform === 'linux') {
263
+ return 'LINUX';
264
+ }
265
+ else if (platform === 'win32') {
266
+ return 'WINDOWS';
267
+ }
268
+ return 'CLI';
269
+ }
270
+ /**
271
+ * Clear all encryption data (on sign out)
272
+ */
273
+ clearAllData() {
274
+ const keyFilePath = this.getKeyFilePath();
275
+ if (fs.existsSync(keyFilePath)) {
276
+ fs.unlinkSync(keyFilePath);
277
+ }
278
+ this.deviceKey = null;
279
+ this.sessionKeyCache.clear();
280
+ this.isRegistered = false;
281
+ logger_1.logger.info('[KeyManager] Cleared all encryption data');
282
+ }
283
+ }
284
+ exports.KeyManager = KeyManager;
285
+ // Export singleton instance
286
+ exports.keyManager = KeyManager.getInstance();
287
+ //# sourceMappingURL=key-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const logger: import("@quantiya/codevibe-core").Logger;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,MAAM,0CAIjB,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = void 0;
7
+ /**
8
+ * Plugin-specific logger for CodeVibe Claude Plugin
9
+ */
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const codevibe_core_1 = require("@quantiya/codevibe-core");
13
+ exports.logger = (0, codevibe_core_1.createLogger)({
14
+ name: 'codevibe-claude',
15
+ logFile: path_1.default.join(os_1.default.tmpdir(), 'codevibe-claude-mcp.log'),
16
+ level: 'info',
17
+ });
18
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;AAAA;;GAEG;AACH,4CAAoB;AACpB,gDAAwB;AACxB,2DAAuD;AAE1C,QAAA,MAAM,GAAG,IAAA,4BAAY,EAAC;IACjC,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC;IAC1D,KAAK,EAAE,MAAM;CACd,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare class PromptResponder {
2
+ /**
3
+ * Answer an interactive prompt by sending input to the waiting Claude process
4
+ * Requires tmux session (set by codevibe-claude wrapper)
5
+ */
6
+ answerInteractivePrompt(sessionId: string, response: string): Promise<boolean>;
7
+ /**
8
+ * Send input via tmux send-keys
9
+ * Works even when screen is locked - this is the only supported method
10
+ */
11
+ private sendViaTmux;
12
+ /**
13
+ * Simple delay helper
14
+ */
15
+ private delay;
16
+ /**
17
+ * Check if a response looks like an answer to an interactive prompt
18
+ * Covers Y/N prompts, numbered choices, and other common responses
19
+ */
20
+ isPromptResponse(content: string): boolean;
21
+ }
22
+ //# sourceMappingURL=prompt-responder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-responder.d.ts","sourceRoot":"","sources":["../src/prompt-responder.ts"],"names":[],"mappings":"AAMA,qBAAa,eAAe;IAC1B;;;OAGG;IACU,uBAAuB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IA0CnB;;;OAGG;YACW,WAAW;IAuCzB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CA0ClD"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptResponder = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const util_1 = require("util");
6
+ const logger_1 = require("./logger");
7
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
8
+ class PromptResponder {
9
+ /**
10
+ * Answer an interactive prompt by sending input to the waiting Claude process
11
+ * Requires tmux session (set by codevibe-claude wrapper)
12
+ */
13
+ async answerInteractivePrompt(sessionId, response) {
14
+ logger_1.logger.info('Attempting to answer interactive prompt', {
15
+ sessionId,
16
+ response,
17
+ });
18
+ try {
19
+ // Check if running in tmux (set by codevibe-claude wrapper)
20
+ const tmuxSession = process.env.CODEVIBE_TMUX_SESSION;
21
+ logger_1.logger.info('Checking tmux session environment', {
22
+ tmuxSession: tmuxSession || '(not set)',
23
+ allEnvKeys: Object.keys(process.env).filter(k => k.includes('CODEVIBE') || k.includes('TMUX')),
24
+ });
25
+ if (!tmuxSession) {
26
+ logger_1.logger.error('No tmux session found - codevibe-claude wrapper is required', {
27
+ sessionId,
28
+ hint: 'Start Claude Code using the codevibe-claude wrapper script',
29
+ });
30
+ return false;
31
+ }
32
+ // Use tmux send-keys (works even when screen is locked)
33
+ logger_1.logger.info('Using tmux send-keys', { tmuxSession });
34
+ await this.sendViaTmux(tmuxSession, response);
35
+ logger_1.logger.info('Successfully sent response to interactive prompt', {
36
+ sessionId,
37
+ response,
38
+ });
39
+ return true;
40
+ }
41
+ catch (error) {
42
+ logger_1.logger.error('Failed to answer interactive prompt', {
43
+ sessionId,
44
+ error: error instanceof Error ? error.message : String(error),
45
+ });
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * Send input via tmux send-keys
51
+ * Works even when screen is locked - this is the only supported method
52
+ */
53
+ async sendViaTmux(sessionName, input) {
54
+ // Escape special characters for tmux
55
+ // tmux send-keys interprets certain sequences, so we need to escape them
56
+ const escaped = input
57
+ .replace(/\\/g, '\\\\') // Escape backslashes first
58
+ .replace(/"/g, '\\"') // Escape double quotes
59
+ .replace(/\$/g, '\\$') // Escape dollar signs
60
+ .replace(/`/g, '\\`'); // Escape backticks
61
+ logger_1.logger.info('Sending via tmux', { sessionName, inputLength: input.length });
62
+ try {
63
+ // Step 1: Send the input text (without Enter)
64
+ const textCmd = `tmux send-keys -t "${sessionName}" -l "${escaped}"`;
65
+ const textResult = await execAsync(textCmd);
66
+ logger_1.logger.info('tmux send-keys (text) completed', {
67
+ stdout: textResult.stdout || '(empty)',
68
+ stderr: textResult.stderr || '(empty)'
69
+ });
70
+ // Step 2: Wait for the text to be processed by the terminal
71
+ // Longer delay needed for Claude Code's interactive prompts
72
+ await this.delay(500);
73
+ // Step 3: Send Enter key separately
74
+ const enterCmd = `tmux send-keys -t "${sessionName}" Enter`;
75
+ const enterResult = await execAsync(enterCmd);
76
+ logger_1.logger.info('tmux send-keys (Enter) completed', {
77
+ stdout: enterResult.stdout || '(empty)',
78
+ stderr: enterResult.stderr || '(empty)'
79
+ });
80
+ }
81
+ catch (error) {
82
+ logger_1.logger.error('tmux send-keys failed', { sessionName, error });
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * Simple delay helper
88
+ */
89
+ delay(ms) {
90
+ return new Promise(resolve => setTimeout(resolve, ms));
91
+ }
92
+ /**
93
+ * Check if a response looks like an answer to an interactive prompt
94
+ * Covers Y/N prompts, numbered choices, and other common responses
95
+ */
96
+ isPromptResponse(content) {
97
+ const normalized = content.trim().toLowerCase();
98
+ // Y/N responses
99
+ if (normalized === 'y' ||
100
+ normalized === 'n' ||
101
+ normalized === 'yes' ||
102
+ normalized === 'no') {
103
+ return true;
104
+ }
105
+ // Numbered choices (1-9, or just digits)
106
+ if (/^[0-9]+$/.test(normalized)) {
107
+ return true;
108
+ }
109
+ // Single letter choices (a, b, c, etc.)
110
+ if (/^[a-z]$/.test(normalized)) {
111
+ return true;
112
+ }
113
+ // Common terminal control inputs
114
+ // These are typically responses to prompts, not new commands
115
+ const controlInputs = [
116
+ 'exit',
117
+ 'quit',
118
+ 'q',
119
+ 'continue',
120
+ 'skip',
121
+ 'abort',
122
+ 'retry',
123
+ 'cancel',
124
+ ];
125
+ if (controlInputs.includes(normalized)) {
126
+ return true;
127
+ }
128
+ return false;
129
+ }
130
+ }
131
+ exports.PromptResponder = PromptResponder;
132
+ //# sourceMappingURL=prompt-responder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-responder.js","sourceRoot":"","sources":["../src/prompt-responder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}