mirra-cc-bridge 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/README.md +62 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +213 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/configure.d.ts +13 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +101 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/hook.d.ts +15 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +181 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +19 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/register.d.ts +13 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +383 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/setup-hooks.d.ts +8 -0
- package/dist/commands/setup-hooks.d.ts.map +1 -0
- package/dist/commands/setup-hooks.js +114 -0
- package/dist/commands/setup-hooks.js.map +1 -0
- package/dist/commands/start.d.ts +16 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +168 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +156 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/session-manager.d.ts +72 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +315 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,uCAAwC;AAA/B,sGAAA,UAAU,OAAA;AACnB,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,+BAAoC;AAA3B,kGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register command - register this PC as a Mirra resource
|
|
3
|
+
*/
|
|
4
|
+
interface RegisterOptions {
|
|
5
|
+
name?: string;
|
|
6
|
+
tunnel?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Register this PC as a Mirra resource
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerPC(options: RegisterOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6KD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+KxE"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Register command - register this PC as a Mirra resource
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.registerPC = registerPC;
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const sdk_1 = require("@mirra-messenger/sdk");
|
|
47
|
+
const config_1 = require("../config");
|
|
48
|
+
/**
|
|
49
|
+
* Prompt for input
|
|
50
|
+
*/
|
|
51
|
+
function prompt(question, defaultValue) {
|
|
52
|
+
const rl = readline.createInterface({
|
|
53
|
+
input: process.stdin,
|
|
54
|
+
output: process.stdout,
|
|
55
|
+
});
|
|
56
|
+
const displayQuestion = defaultValue
|
|
57
|
+
? `${question} [${defaultValue}]: `
|
|
58
|
+
: `${question}: `;
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
rl.question(displayQuestion, (answer) => {
|
|
61
|
+
rl.close();
|
|
62
|
+
resolve(answer || defaultValue || '');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate OpenAPI spec for the PC resource
|
|
68
|
+
*/
|
|
69
|
+
function generateOpenAPISpec() {
|
|
70
|
+
return {
|
|
71
|
+
openapi: '3.0.0',
|
|
72
|
+
info: {
|
|
73
|
+
title: 'Mirra Claude Code Bridge',
|
|
74
|
+
version: '1.0.0',
|
|
75
|
+
description: 'Control Claude Code sessions on a local PC',
|
|
76
|
+
},
|
|
77
|
+
paths: {
|
|
78
|
+
'/sessions': {
|
|
79
|
+
get: {
|
|
80
|
+
operationId: 'listSessions',
|
|
81
|
+
summary: 'List active Claude Code sessions',
|
|
82
|
+
responses: {
|
|
83
|
+
'200': {
|
|
84
|
+
description: 'List of sessions',
|
|
85
|
+
content: {
|
|
86
|
+
'application/json': {
|
|
87
|
+
schema: {
|
|
88
|
+
type: 'array',
|
|
89
|
+
items: { $ref: '#/components/schemas/Session' },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
post: {
|
|
97
|
+
operationId: 'spawnSession',
|
|
98
|
+
summary: 'Spawn a new Claude Code session',
|
|
99
|
+
requestBody: {
|
|
100
|
+
content: {
|
|
101
|
+
'application/json': {
|
|
102
|
+
schema: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
required: ['initialPrompt', 'recipientId'],
|
|
105
|
+
properties: {
|
|
106
|
+
workingDir: { type: 'string' },
|
|
107
|
+
initialPrompt: { type: 'string' },
|
|
108
|
+
recipientId: { type: 'string' },
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
responses: {
|
|
115
|
+
'201': {
|
|
116
|
+
description: 'Session created',
|
|
117
|
+
content: {
|
|
118
|
+
'application/json': {
|
|
119
|
+
schema: { $ref: '#/components/schemas/Session' },
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
'/sessions/{sessionId}': {
|
|
127
|
+
get: {
|
|
128
|
+
operationId: 'getSession',
|
|
129
|
+
summary: 'Get session details',
|
|
130
|
+
parameters: [
|
|
131
|
+
{
|
|
132
|
+
name: 'sessionId',
|
|
133
|
+
in: 'path',
|
|
134
|
+
required: true,
|
|
135
|
+
schema: { type: 'string' },
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
responses: {
|
|
139
|
+
'200': {
|
|
140
|
+
description: 'Session details',
|
|
141
|
+
content: {
|
|
142
|
+
'application/json': {
|
|
143
|
+
schema: { $ref: '#/components/schemas/Session' },
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
delete: {
|
|
150
|
+
operationId: 'killSession',
|
|
151
|
+
summary: 'Kill a session',
|
|
152
|
+
parameters: [
|
|
153
|
+
{
|
|
154
|
+
name: 'sessionId',
|
|
155
|
+
in: 'path',
|
|
156
|
+
required: true,
|
|
157
|
+
schema: { type: 'string' },
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
responses: {
|
|
161
|
+
'200': { description: 'Session killed' },
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
'/sessions/{sessionId}/input': {
|
|
166
|
+
post: {
|
|
167
|
+
operationId: 'sendInput',
|
|
168
|
+
summary: 'Send input to a session',
|
|
169
|
+
parameters: [
|
|
170
|
+
{
|
|
171
|
+
name: 'sessionId',
|
|
172
|
+
in: 'path',
|
|
173
|
+
required: true,
|
|
174
|
+
schema: { type: 'string' },
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
requestBody: {
|
|
178
|
+
content: {
|
|
179
|
+
'application/json': {
|
|
180
|
+
schema: {
|
|
181
|
+
type: 'object',
|
|
182
|
+
required: ['input'],
|
|
183
|
+
properties: {
|
|
184
|
+
input: { type: 'string' },
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
responses: {
|
|
191
|
+
'200': { description: 'Input sent' },
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
components: {
|
|
197
|
+
schemas: {
|
|
198
|
+
Session: {
|
|
199
|
+
type: 'object',
|
|
200
|
+
properties: {
|
|
201
|
+
id: { type: 'string' },
|
|
202
|
+
workingDir: { type: 'string' },
|
|
203
|
+
status: {
|
|
204
|
+
type: 'string',
|
|
205
|
+
enum: ['starting', 'running', 'stopped', 'error'],
|
|
206
|
+
},
|
|
207
|
+
createdAt: { type: 'string', format: 'date-time' },
|
|
208
|
+
lastActivity: { type: 'string', format: 'date-time' },
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Register this PC as a Mirra resource
|
|
217
|
+
*/
|
|
218
|
+
async function registerPC(options) {
|
|
219
|
+
console.log(chalk_1.default.gray('\nRegistering PC as Mirra resource...\n'));
|
|
220
|
+
const config = (0, config_1.loadConfig)();
|
|
221
|
+
if (!config?.apiKey) {
|
|
222
|
+
throw new Error('Not configured. Run `mirra-cc-bridge configure` first.');
|
|
223
|
+
}
|
|
224
|
+
// Get PC name
|
|
225
|
+
const defaultName = `${os.hostname()} - Claude Code`;
|
|
226
|
+
const pcName = options.name || (await prompt('Name for this PC', defaultName));
|
|
227
|
+
// Get tunnel URL
|
|
228
|
+
console.log(chalk_1.default.gray('\nYou need a tunnel URL for the PC to be reachable.'));
|
|
229
|
+
console.log(chalk_1.default.gray(' Run: ngrok http 3847'));
|
|
230
|
+
console.log(chalk_1.default.gray(' Or use Cloudflare Tunnel\n'));
|
|
231
|
+
const tunnelUrl = await prompt('Enter your tunnel URL (e.g., https://abc123.ngrok.io)');
|
|
232
|
+
if (!tunnelUrl) {
|
|
233
|
+
throw new Error('Tunnel URL is required for registration');
|
|
234
|
+
}
|
|
235
|
+
// Validate URL format
|
|
236
|
+
if (!tunnelUrl.startsWith('http://') && !tunnelUrl.startsWith('https://')) {
|
|
237
|
+
throw new Error('Tunnel URL must start with http:// or https://');
|
|
238
|
+
}
|
|
239
|
+
console.log(chalk_1.default.gray('\nRegistering with Mirra...'));
|
|
240
|
+
const sdk = new sdk_1.MirraSDK({ apiKey: config.apiKey });
|
|
241
|
+
try {
|
|
242
|
+
// Check if already registered
|
|
243
|
+
if (config.pcResourceId) {
|
|
244
|
+
console.log(chalk_1.default.yellow('PC already registered. Updating...'));
|
|
245
|
+
// Update existing resource
|
|
246
|
+
await sdk.resources.update({
|
|
247
|
+
id: config.pcResourceId,
|
|
248
|
+
endpoint: {
|
|
249
|
+
baseUrl: tunnelUrl,
|
|
250
|
+
authentication: 'none', // The service will validate via other means
|
|
251
|
+
methods: [
|
|
252
|
+
{
|
|
253
|
+
name: 'spawnSession',
|
|
254
|
+
httpMethod: 'POST',
|
|
255
|
+
path: '/sessions',
|
|
256
|
+
description: 'Spawn a new Claude Code session',
|
|
257
|
+
parameters: {
|
|
258
|
+
workingDir: { type: 'string', required: false },
|
|
259
|
+
initialPrompt: { type: 'string', required: true },
|
|
260
|
+
recipientId: { type: 'string', required: true },
|
|
261
|
+
},
|
|
262
|
+
response: { type: 'object' },
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: 'sendInput',
|
|
266
|
+
httpMethod: 'POST',
|
|
267
|
+
path: '/sessions/{sessionId}/input',
|
|
268
|
+
description: 'Send input to a session',
|
|
269
|
+
parameters: {
|
|
270
|
+
sessionId: { type: 'string', required: true },
|
|
271
|
+
input: { type: 'string', required: true },
|
|
272
|
+
},
|
|
273
|
+
response: { type: 'object' },
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
name: 'killSession',
|
|
277
|
+
httpMethod: 'DELETE',
|
|
278
|
+
path: '/sessions/{sessionId}',
|
|
279
|
+
description: 'Kill a session',
|
|
280
|
+
parameters: {
|
|
281
|
+
sessionId: { type: 'string', required: true },
|
|
282
|
+
},
|
|
283
|
+
response: { type: 'object' },
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: 'listSessions',
|
|
287
|
+
httpMethod: 'GET',
|
|
288
|
+
path: '/sessions',
|
|
289
|
+
description: 'List active sessions',
|
|
290
|
+
parameters: {},
|
|
291
|
+
response: { type: 'array' },
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
console.log(chalk_1.default.green('\n[+] PC resource updated'));
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// Create new resource
|
|
300
|
+
const resource = await sdk.resources.create({
|
|
301
|
+
name: pcName,
|
|
302
|
+
description: `Claude Code on ${os.hostname()}`,
|
|
303
|
+
resourceType: 'integration',
|
|
304
|
+
category: 'development',
|
|
305
|
+
isPrivate: true,
|
|
306
|
+
endpoint: {
|
|
307
|
+
baseUrl: tunnelUrl,
|
|
308
|
+
authentication: 'none',
|
|
309
|
+
methods: [
|
|
310
|
+
{
|
|
311
|
+
name: 'spawnSession',
|
|
312
|
+
httpMethod: 'POST',
|
|
313
|
+
path: '/sessions',
|
|
314
|
+
description: 'Spawn a new Claude Code session',
|
|
315
|
+
parameters: {
|
|
316
|
+
workingDir: { type: 'string', required: false },
|
|
317
|
+
initialPrompt: { type: 'string', required: true },
|
|
318
|
+
recipientId: { type: 'string', required: true },
|
|
319
|
+
},
|
|
320
|
+
response: { type: 'object' },
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: 'sendInput',
|
|
324
|
+
httpMethod: 'POST',
|
|
325
|
+
path: '/sessions/{sessionId}/input',
|
|
326
|
+
description: 'Send input to a session',
|
|
327
|
+
parameters: {
|
|
328
|
+
sessionId: { type: 'string', required: true },
|
|
329
|
+
input: { type: 'string', required: true },
|
|
330
|
+
},
|
|
331
|
+
response: { type: 'object' },
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
name: 'killSession',
|
|
335
|
+
httpMethod: 'DELETE',
|
|
336
|
+
path: '/sessions/{sessionId}',
|
|
337
|
+
description: 'Kill a session',
|
|
338
|
+
parameters: {
|
|
339
|
+
sessionId: { type: 'string', required: true },
|
|
340
|
+
},
|
|
341
|
+
response: { type: 'object' },
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
name: 'listSessions',
|
|
345
|
+
httpMethod: 'GET',
|
|
346
|
+
path: '/sessions',
|
|
347
|
+
description: 'List active sessions',
|
|
348
|
+
parameters: {},
|
|
349
|
+
response: { type: 'array' },
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
},
|
|
353
|
+
pricing: { model: 'free' },
|
|
354
|
+
openApiSpec: generateOpenAPISpec(),
|
|
355
|
+
});
|
|
356
|
+
// Save resource ID
|
|
357
|
+
(0, config_1.setConfigValue)('pcResourceId', resource.id);
|
|
358
|
+
console.log(chalk_1.default.green('\n[+] PC registered'));
|
|
359
|
+
console.log(chalk_1.default.gray(` resource_id: ${resource.id}`));
|
|
360
|
+
}
|
|
361
|
+
// Install the resource for the user
|
|
362
|
+
console.log(chalk_1.default.gray('\nInstalling resource...'));
|
|
363
|
+
try {
|
|
364
|
+
await sdk.resources.install(config.pcResourceId || '');
|
|
365
|
+
console.log(chalk_1.default.green('[+] Resource installed'));
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
if (e.message?.includes('already installed')) {
|
|
369
|
+
console.log(chalk_1.default.gray(' Already installed'));
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
console.log(chalk_1.default.yellow(` Could not auto-install: ${e.message}`));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
console.log(chalk_1.default.green('\n> Registration complete.'));
|
|
376
|
+
console.log(chalk_1.default.gray('\nRemote control enabled. Start the bridge with:'));
|
|
377
|
+
console.log(chalk_1.default.white(' mirra-cc-bridge start'));
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
throw new Error(`Registration failed: ${error.message}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/setup-hooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgDH;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmFhD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Setup hooks command - configure Claude Code to send output to Mirra
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.setupHooks = setupHooks;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const os_1 = require("os");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
const config_1 = require("../config");
|
|
15
|
+
const CLAUDE_CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude');
|
|
16
|
+
const CLAUDE_SETTINGS_FILE = (0, path_1.join)(CLAUDE_CONFIG_DIR, 'settings.json');
|
|
17
|
+
const MIRRA_HOOKS = {
|
|
18
|
+
PostMessage: {
|
|
19
|
+
command: 'mirra-cc-bridge hook post-message',
|
|
20
|
+
},
|
|
21
|
+
PostToolUse: {
|
|
22
|
+
matcher: '.*',
|
|
23
|
+
command: 'mirra-cc-bridge hook post-tool',
|
|
24
|
+
},
|
|
25
|
+
Stop: {
|
|
26
|
+
command: 'mirra-cc-bridge hook stop',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Check if a hook already exists
|
|
31
|
+
*/
|
|
32
|
+
function hookExists(hooks, command) {
|
|
33
|
+
if (!hooks)
|
|
34
|
+
return false;
|
|
35
|
+
return hooks.some((h) => h.command.includes('mirra-cc-bridge'));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Setup Claude Code hooks
|
|
39
|
+
*/
|
|
40
|
+
async function setupHooks() {
|
|
41
|
+
console.log(chalk_1.default.gray('Setting up Claude Code hooks...\n'));
|
|
42
|
+
// Ensure Claude config directory exists
|
|
43
|
+
if (!(0, fs_1.existsSync)(CLAUDE_CONFIG_DIR)) {
|
|
44
|
+
console.log(chalk_1.default.yellow('Claude Code config directory not found. Creating...'));
|
|
45
|
+
(0, fs_1.mkdirSync)(CLAUDE_CONFIG_DIR, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
// Load existing settings or create new
|
|
48
|
+
let settings = {};
|
|
49
|
+
if ((0, fs_1.existsSync)(CLAUDE_SETTINGS_FILE)) {
|
|
50
|
+
try {
|
|
51
|
+
const content = (0, fs_1.readFileSync)(CLAUDE_SETTINGS_FILE, 'utf-8');
|
|
52
|
+
settings = JSON.parse(content);
|
|
53
|
+
console.log(chalk_1.default.gray('Loaded existing Claude Code settings'));
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.log(chalk_1.default.yellow('Could not parse existing settings, starting fresh'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Initialize hooks object if it doesn't exist
|
|
60
|
+
if (!settings.hooks) {
|
|
61
|
+
settings.hooks = {};
|
|
62
|
+
}
|
|
63
|
+
let hooksAdded = 0;
|
|
64
|
+
// Add PostMessage hook
|
|
65
|
+
if (!hookExists(settings.hooks.PostMessage, 'mirra-cc-bridge')) {
|
|
66
|
+
settings.hooks.PostMessage = [
|
|
67
|
+
...(settings.hooks.PostMessage || []),
|
|
68
|
+
MIRRA_HOOKS.PostMessage,
|
|
69
|
+
];
|
|
70
|
+
console.log(chalk_1.default.green('[+]') + ' Added PostMessage hook');
|
|
71
|
+
hooksAdded++;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(chalk_1.default.gray('- PostMessage hook already exists'));
|
|
75
|
+
}
|
|
76
|
+
// Add PostToolUse hook
|
|
77
|
+
if (!hookExists(settings.hooks.PostToolUse, 'mirra-cc-bridge')) {
|
|
78
|
+
settings.hooks.PostToolUse = [
|
|
79
|
+
...(settings.hooks.PostToolUse || []),
|
|
80
|
+
MIRRA_HOOKS.PostToolUse,
|
|
81
|
+
];
|
|
82
|
+
console.log(chalk_1.default.green('[+]') + ' Added PostToolUse hook');
|
|
83
|
+
hooksAdded++;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(chalk_1.default.gray('- PostToolUse hook already exists'));
|
|
87
|
+
}
|
|
88
|
+
// Add Stop hook
|
|
89
|
+
if (!hookExists(settings.hooks.Stop, 'mirra-cc-bridge')) {
|
|
90
|
+
settings.hooks.Stop = [...(settings.hooks.Stop || []), MIRRA_HOOKS.Stop];
|
|
91
|
+
console.log(chalk_1.default.green('[+]') + ' Added Stop hook');
|
|
92
|
+
hooksAdded++;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log(chalk_1.default.gray('- Stop hook already exists'));
|
|
96
|
+
}
|
|
97
|
+
// Save settings
|
|
98
|
+
(0, fs_1.writeFileSync)(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2));
|
|
99
|
+
console.log(chalk_1.default.gray(`\nSettings saved to: ${CLAUDE_SETTINGS_FILE}`));
|
|
100
|
+
if (hooksAdded > 0) {
|
|
101
|
+
console.log(chalk_1.default.green(`\n[+] ${hooksAdded} hook(s) configured`));
|
|
102
|
+
console.log(chalk_1.default.gray('\nClaude Code will now send output to Mirra when running.'));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(chalk_1.default.yellow('\nAll hooks were already configured.'));
|
|
106
|
+
}
|
|
107
|
+
console.log(chalk_1.default.bold('\nHooks configured:'));
|
|
108
|
+
console.log(' • PostMessage - Sends Claude\'s responses to your mobile app');
|
|
109
|
+
console.log(' • PostToolUse - Sends tool results (edits, commands, etc.)');
|
|
110
|
+
console.log(' • Stop - Notifies when session ends');
|
|
111
|
+
// Mark hooks as configured
|
|
112
|
+
(0, config_1.setConfigValue)('hooksConfigured', true);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=setup-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-hooks.js","sourceRoot":"","sources":["../../src/commands/setup-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start command - launch the bridge HTTP server
|
|
3
|
+
*
|
|
4
|
+
* This server receives commands from the Mirra mobile app via the PC resource.
|
|
5
|
+
* It manages Claude Code sessions and creates Flows for reply routing.
|
|
6
|
+
*/
|
|
7
|
+
interface StartOptions {
|
|
8
|
+
port: string;
|
|
9
|
+
tunnel?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Start the bridge server
|
|
13
|
+
*/
|
|
14
|
+
export declare function startServer(options: StartOptions): Promise<void>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuHD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtE"}
|