cubelife 0.2.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/LICENSE +21 -0
- package/README.md +81 -0
- package/SPRITE-LICENSE +14 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +39 -0
- package/dist/commands/agents.d.ts +2 -0
- package/dist/commands/agents.js +303 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +233 -0
- package/dist/commands/billing.d.ts +2 -0
- package/dist/commands/billing.js +362 -0
- package/dist/commands/creature.d.ts +2 -0
- package/dist/commands/creature.js +166 -0
- package/dist/commands/default.d.ts +2 -0
- package/dist/commands/default.js +87 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +48 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +9 -0
- package/dist/commands/projects.d.ts +2 -0
- package/dist/commands/projects.js +122 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +453 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/tutorial.d.ts +2 -0
- package/dist/commands/tutorial.js +9 -0
- package/dist/commands/view.d.ts +2 -0
- package/dist/commands/view.js +262 -0
- package/dist/data/sprite-data.d.ts +32 -0
- package/dist/data/sprite-data.js +865 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/lib/api.d.ts +162 -0
- package/dist/lib/api.js +160 -0
- package/dist/lib/auth.d.ts +12 -0
- package/dist/lib/auth.js +113 -0
- package/dist/lib/browser.d.ts +1 -0
- package/dist/lib/browser.js +21 -0
- package/dist/lib/command-helpers.d.ts +26 -0
- package/dist/lib/command-helpers.js +60 -0
- package/dist/lib/compositor.d.ts +34 -0
- package/dist/lib/compositor.js +232 -0
- package/dist/lib/config.d.ts +39 -0
- package/dist/lib/config.js +89 -0
- package/dist/lib/constants.d.ts +12 -0
- package/dist/lib/constants.js +39 -0
- package/dist/lib/detect.d.ts +17 -0
- package/dist/lib/detect.js +99 -0
- package/dist/lib/doctor.d.ts +18 -0
- package/dist/lib/doctor.js +321 -0
- package/dist/lib/index.d.ts +11 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/integration.d.ts +66 -0
- package/dist/lib/integration.js +337 -0
- package/dist/lib/poll.d.ts +11 -0
- package/dist/lib/poll.js +31 -0
- package/dist/lib/resolve.d.ts +1 -0
- package/dist/lib/resolve.js +10 -0
- package/dist/lib/services/account-service.d.ts +17 -0
- package/dist/lib/services/account-service.js +30 -0
- package/dist/lib/services/agent-service.d.ts +17 -0
- package/dist/lib/services/agent-service.js +62 -0
- package/dist/lib/services/creature-service.d.ts +12 -0
- package/dist/lib/services/creature-service.js +35 -0
- package/dist/lib/services/project-service.d.ts +9 -0
- package/dist/lib/services/project-service.js +22 -0
- package/dist/lib/tutorial.d.ts +12 -0
- package/dist/lib/tutorial.js +358 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +116 -0
- package/dist/ui/banner.d.ts +3 -0
- package/dist/ui/banner.js +27 -0
- package/dist/ui/half-block.d.ts +6 -0
- package/dist/ui/half-block.js +45 -0
- package/dist/ui/helpers.d.ts +3 -0
- package/dist/ui/helpers.js +11 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/panel.d.ts +7 -0
- package/dist/ui/panel.js +21 -0
- package/dist/ui/preview.d.ts +7 -0
- package/dist/ui/preview.js +21 -0
- package/dist/ui/table.d.ts +8 -0
- package/dist/ui/table.js +20 -0
- package/dist/ui/theme.d.ts +24 -0
- package/dist/ui/theme.js +32 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { currentUser, refreshToken } from './auth.js';
|
|
5
|
+
import { readProjectConfig, readAgents, resolveAgentKey } from './config.js';
|
|
6
|
+
import { createAdminClient, AgentClient, TIER_LIMITS } from './api.js';
|
|
7
|
+
import { detectInstalledTools } from './detect.js';
|
|
8
|
+
import { readClaudeSettings, hasMcpServer, hasHookIntegration, hookScriptPath, resolveProjectRoot, isClaudeMcpRegistered } from './integration.js';
|
|
9
|
+
import { API_BASE_URL, API_TIMEOUT_MS, ID_DISPLAY_LENGTH } from './constants.js';
|
|
10
|
+
export async function checkAuth(autoFix) {
|
|
11
|
+
const user = await currentUser();
|
|
12
|
+
if (!user) {
|
|
13
|
+
return {
|
|
14
|
+
name: 'Auth',
|
|
15
|
+
status: 'fail',
|
|
16
|
+
message: 'Not logged in',
|
|
17
|
+
fix: 'Run cubelife login to authenticate.',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const expired = Date.now() >= (user.expiresAt ?? 0);
|
|
21
|
+
if (expired && autoFix) {
|
|
22
|
+
try {
|
|
23
|
+
await refreshToken();
|
|
24
|
+
return { name: 'Auth', status: 'pass', message: `Token refreshed for ${user.email}` };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return {
|
|
28
|
+
name: 'Auth',
|
|
29
|
+
status: 'fail',
|
|
30
|
+
message: 'Token expired and refresh failed',
|
|
31
|
+
fix: 'Run cubelife login to re-authenticate.',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (expired) {
|
|
36
|
+
return {
|
|
37
|
+
name: 'Auth',
|
|
38
|
+
status: 'warn',
|
|
39
|
+
message: 'Token expired',
|
|
40
|
+
fix: 'Run cubelife doctor --fix to refresh, or cubelife login to re-authenticate.',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return { name: 'Auth', status: 'pass', message: `Logged in as ${user.email}` };
|
|
44
|
+
}
|
|
45
|
+
export async function checkTier(adminClient) {
|
|
46
|
+
try {
|
|
47
|
+
const client = adminClient ?? await createAdminClient();
|
|
48
|
+
const billing = await client.getBillingUser();
|
|
49
|
+
const tier = billing.tier;
|
|
50
|
+
const limits = TIER_LIMITS[tier];
|
|
51
|
+
const usage = await client.getBillingUsage(1);
|
|
52
|
+
const today = usage[0];
|
|
53
|
+
if (today) {
|
|
54
|
+
const pct = limits.calls > 0 ? (today.eventsProcessed / limits.calls) * 100 : 0;
|
|
55
|
+
if (pct > 80) {
|
|
56
|
+
return {
|
|
57
|
+
name: 'Tier',
|
|
58
|
+
status: 'warn',
|
|
59
|
+
message: `${limits.label} tier, ${Math.round(pct)}% of daily limit used (${today.eventsProcessed}/${limits.calls})`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
name: 'Tier',
|
|
64
|
+
status: 'pass',
|
|
65
|
+
message: `${limits.label} tier, ${today.eventsProcessed}/${limits.calls} calls today`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { name: 'Tier', status: 'pass', message: `${limits.label} tier` };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return {
|
|
72
|
+
name: 'Tier',
|
|
73
|
+
status: 'warn',
|
|
74
|
+
message: `Could not fetch billing info: ${err.message}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export async function checkProject(adminClient) {
|
|
79
|
+
const config = await readProjectConfig();
|
|
80
|
+
if (!config?.projectId) {
|
|
81
|
+
return {
|
|
82
|
+
name: 'Project',
|
|
83
|
+
status: 'fail',
|
|
84
|
+
message: 'No project linked',
|
|
85
|
+
fix: 'Run cubelife init or cubelife tutorial to link a project.',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const client = adminClient ?? await createAdminClient();
|
|
90
|
+
const { projects } = await client.listProjects();
|
|
91
|
+
const found = projects.find((p) => p.id === config.projectId);
|
|
92
|
+
if (!found) {
|
|
93
|
+
return {
|
|
94
|
+
name: 'Project',
|
|
95
|
+
status: 'fail',
|
|
96
|
+
message: `Project ${config.projectId.slice(0, ID_DISPLAY_LENGTH)} not found on server`,
|
|
97
|
+
fix: 'Run cubelife init to link a different project.',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { name: 'Project', status: 'pass', message: `${found.name} (${config.projectId.slice(0, ID_DISPLAY_LENGTH)})` };
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return {
|
|
104
|
+
name: 'Project',
|
|
105
|
+
status: 'warn',
|
|
106
|
+
message: `Project config present but could not verify: ${err.message}`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export async function checkAgent(adminClient) {
|
|
111
|
+
const config = await readProjectConfig();
|
|
112
|
+
if (!config?.projectId || !config?.agentId) {
|
|
113
|
+
return {
|
|
114
|
+
name: 'Agent',
|
|
115
|
+
status: 'fail',
|
|
116
|
+
message: 'No agent linked',
|
|
117
|
+
fix: 'Run cubelife init or cubelife tutorial to create an agent.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const client = adminClient ?? await createAdminClient();
|
|
122
|
+
const agent = await client.getAgent(config.projectId, config.agentId);
|
|
123
|
+
return {
|
|
124
|
+
name: 'Agent',
|
|
125
|
+
status: 'pass',
|
|
126
|
+
message: `${agent.name} (${agent.form})`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return {
|
|
131
|
+
name: 'Agent',
|
|
132
|
+
status: 'fail',
|
|
133
|
+
message: 'Agent ID in config but not found on server',
|
|
134
|
+
fix: 'Run cubelife init to link a different agent.',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function checkApiKey() {
|
|
139
|
+
const config = await readProjectConfig();
|
|
140
|
+
if (!config?.agentId) {
|
|
141
|
+
return {
|
|
142
|
+
name: 'API Key',
|
|
143
|
+
status: 'fail',
|
|
144
|
+
message: 'No agent linked',
|
|
145
|
+
fix: 'Run cubelife init or cubelife tutorial first.',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const store = await readAgents();
|
|
149
|
+
const key = resolveAgentKey(config.agentId, store);
|
|
150
|
+
if (!key) {
|
|
151
|
+
return {
|
|
152
|
+
name: 'API Key',
|
|
153
|
+
status: 'fail',
|
|
154
|
+
message: 'No API key found for linked agent',
|
|
155
|
+
fix: 'Run cubelife agents key <id> --regenerate to get a new key.',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const client = new AgentClient(key);
|
|
160
|
+
await client.getState();
|
|
161
|
+
return { name: 'API Key', status: 'pass', message: 'Valid (state read succeeded)' };
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return {
|
|
165
|
+
name: 'API Key',
|
|
166
|
+
status: 'warn',
|
|
167
|
+
message: 'Key present but state read failed (may be a network issue)',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export async function checkIntegration() {
|
|
172
|
+
const tools = detectInstalledTools();
|
|
173
|
+
if (tools.length === 0) {
|
|
174
|
+
return {
|
|
175
|
+
name: 'Integration',
|
|
176
|
+
status: 'warn',
|
|
177
|
+
message: 'No AI tools detected',
|
|
178
|
+
fix: 'Run cubelife setup <tool> after installing an AI coding tool.',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const root = resolveProjectRoot();
|
|
182
|
+
const issues = [];
|
|
183
|
+
const configured = [];
|
|
184
|
+
const claudeCode = tools.find((t) => t.id === 'claude-code');
|
|
185
|
+
if (claudeCode) {
|
|
186
|
+
const settings = await readClaudeSettings(root);
|
|
187
|
+
const globalSettings = await readClaudeSettings(homedir());
|
|
188
|
+
const hasMcp = isClaudeMcpRegistered() || hasMcpServer(settings) || hasMcpServer(globalSettings);
|
|
189
|
+
const hasHooks = hasHookIntegration(settings) || hasHookIntegration(globalSettings);
|
|
190
|
+
if (hasMcp && hasHooks) {
|
|
191
|
+
configured.push('Claude Code (MCP + Hooks)');
|
|
192
|
+
}
|
|
193
|
+
else if (hasMcp) {
|
|
194
|
+
configured.push('Claude Code (MCP only)');
|
|
195
|
+
issues.push('Claude Code hooks not configured (hooks-only mode available)');
|
|
196
|
+
}
|
|
197
|
+
else if (hasHooks) {
|
|
198
|
+
configured.push('Claude Code (Hooks only)');
|
|
199
|
+
issues.push('Claude Code MCP not configured');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
issues.push('Claude Code detected but not configured');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const others = tools.filter((t) => t.id !== 'claude-code');
|
|
206
|
+
for (const t of others) {
|
|
207
|
+
issues.push(`${t.name} detected but not yet configured`);
|
|
208
|
+
}
|
|
209
|
+
if (configured.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
name: 'Integration',
|
|
212
|
+
status: 'fail',
|
|
213
|
+
message: `No tools configured. ${issues.join('. ')}`,
|
|
214
|
+
fix: 'Run cubelife setup claude-code to configure.',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (issues.length > 0) {
|
|
218
|
+
return {
|
|
219
|
+
name: 'Integration',
|
|
220
|
+
status: 'warn',
|
|
221
|
+
message: `${configured.join(', ')}. ${issues.join('. ')}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return { name: 'Integration', status: 'pass', message: configured.join(', ') };
|
|
225
|
+
}
|
|
226
|
+
export async function checkHookScript() {
|
|
227
|
+
const path = hookScriptPath();
|
|
228
|
+
if (!existsSync(path)) {
|
|
229
|
+
return {
|
|
230
|
+
name: 'Hook Script',
|
|
231
|
+
status: 'warn',
|
|
232
|
+
message: 'Hook script not found',
|
|
233
|
+
fix: 'Run cubelife setup claude-code to generate it.',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (process.platform !== 'win32') {
|
|
237
|
+
try {
|
|
238
|
+
const s = await stat(path);
|
|
239
|
+
const isExecutable = !!(s.mode & 0o111);
|
|
240
|
+
if (!isExecutable) {
|
|
241
|
+
return {
|
|
242
|
+
name: 'Hook Script',
|
|
243
|
+
status: 'warn',
|
|
244
|
+
message: 'Hook script exists but is not executable',
|
|
245
|
+
fix: `Run chmod +x ${path} or cubelife setup claude-code to fix.`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return { name: 'Hook Script', status: 'warn', message: 'Could not check hook script permissions' };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return { name: 'Hook Script', status: 'pass', message: path };
|
|
254
|
+
}
|
|
255
|
+
export async function checkConnectivity() {
|
|
256
|
+
const start = Date.now();
|
|
257
|
+
try {
|
|
258
|
+
const res = await fetch(`${API_BASE_URL}/api/v1/state`, {
|
|
259
|
+
method: 'GET',
|
|
260
|
+
signal: AbortSignal.timeout(API_TIMEOUT_MS),
|
|
261
|
+
});
|
|
262
|
+
const latency = Date.now() - start;
|
|
263
|
+
if (res.status < 500) {
|
|
264
|
+
return { name: 'Connectivity', status: 'pass', message: `API reachable (${latency}ms)` };
|
|
265
|
+
}
|
|
266
|
+
return { name: 'Connectivity', status: 'warn', message: `API responded with ${res.status} (${latency}ms)` };
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return {
|
|
270
|
+
name: 'Connectivity',
|
|
271
|
+
status: 'fail',
|
|
272
|
+
message: 'Cannot reach API',
|
|
273
|
+
fix: 'Check your internet connection.',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
export async function checkStateReport() {
|
|
278
|
+
const config = await readProjectConfig();
|
|
279
|
+
if (!config?.agentId) {
|
|
280
|
+
return { name: 'State Report', status: 'fail', message: 'No agent linked' };
|
|
281
|
+
}
|
|
282
|
+
const store = await readAgents();
|
|
283
|
+
const key = resolveAgentKey(config.agentId, store);
|
|
284
|
+
if (!key) {
|
|
285
|
+
return { name: 'State Report', status: 'fail', message: 'No API key available' };
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const client = new AgentClient(key);
|
|
289
|
+
await client.report('idle');
|
|
290
|
+
return { name: 'State Report', status: 'pass', message: 'Test report delivered' };
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
return {
|
|
294
|
+
name: 'State Report',
|
|
295
|
+
status: 'fail',
|
|
296
|
+
message: `Report failed: ${err.message}`,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
export async function runAllChecks(autoFix) {
|
|
301
|
+
const results = [];
|
|
302
|
+
results.push(await checkAuth(autoFix));
|
|
303
|
+
let adminClient;
|
|
304
|
+
if (results[results.length - 1].status !== 'fail') {
|
|
305
|
+
try {
|
|
306
|
+
adminClient = await createAdminClient();
|
|
307
|
+
}
|
|
308
|
+
catch { /* checked individually below */ }
|
|
309
|
+
results.push(await checkTier(adminClient));
|
|
310
|
+
}
|
|
311
|
+
results.push(await checkProject(adminClient));
|
|
312
|
+
results.push(await checkAgent(adminClient));
|
|
313
|
+
results.push(await checkApiKey());
|
|
314
|
+
results.push(await checkIntegration());
|
|
315
|
+
results.push(await checkHookScript());
|
|
316
|
+
results.push(await checkConnectivity());
|
|
317
|
+
if (results.find((r) => r.name === 'API Key')?.status === 'pass') {
|
|
318
|
+
results.push(await checkStateReport());
|
|
319
|
+
}
|
|
320
|
+
return results;
|
|
321
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { readGlobalConfig, writeGlobalConfig, readAgents, writeAgents, readProjectConfig, writeProjectConfig, resolveAgentKey, hasAuth, isTokenExpired, globalDir, globalConfigPath, agentsPath, projectConfigPath, projectDirPath, } from './config.js';
|
|
2
|
+
export type { GlobalConfig, AuthConfig, AgentEntry, AgentsStore, ProjectConfig, } from './config.js';
|
|
3
|
+
export { register, login, logout, refreshToken, getValidToken, currentUser, requireAuth, } from './auth.js';
|
|
4
|
+
export type { AuthSession } from './auth.js';
|
|
5
|
+
export { AdminClient, AgentClient, createAdminClient, createAgentClient, TIER_LIMITS, } from './api.js';
|
|
6
|
+
export type { BillingUser, UsageDay, Tier } from './api.js';
|
|
7
|
+
export { detectTools, detectInstalledTools } from './detect.js';
|
|
8
|
+
export type { DetectedTool } from './detect.js';
|
|
9
|
+
export { rootOpts, getErrorMessage, handleCommandError, requireProject, requireLinkedAgent, } from './command-helpers.js';
|
|
10
|
+
export type { RootOpts, CommandErrorOptions, ResolvedProject, ResolvedAgent } from './command-helpers.js';
|
|
11
|
+
export { API_BASE_URL, ID_DISPLAY_LENGTH, LABEL_WIDTH, DEFAULT_PANEL_WIDTH, API_TIMEOUT_MS, } from './constants.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { readGlobalConfig, writeGlobalConfig, readAgents, writeAgents, readProjectConfig, writeProjectConfig, resolveAgentKey, hasAuth, isTokenExpired, globalDir, globalConfigPath, agentsPath, projectConfigPath, projectDirPath, } from './config.js';
|
|
2
|
+
export { register, login, logout, refreshToken, getValidToken, currentUser, requireAuth, } from './auth.js';
|
|
3
|
+
export { AdminClient, AgentClient, createAdminClient, createAgentClient, TIER_LIMITS, } from './api.js';
|
|
4
|
+
export { detectTools, detectInstalledTools } from './detect.js';
|
|
5
|
+
export { rootOpts, getErrorMessage, handleCommandError, requireProject, requireLinkedAgent, } from './command-helpers.js';
|
|
6
|
+
export { API_BASE_URL, ID_DISPLAY_LENGTH, LABEL_WIDTH, DEFAULT_PANEL_WIDTH, API_TIMEOUT_MS, } from './constants.js';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type IntegrationMode = 'mcp' | 'hooks' | 'both';
|
|
2
|
+
export declare function readJsonConfig(path: string): Promise<Record<string, unknown>>;
|
|
3
|
+
export declare function writeJsonConfig(path: string, config: Record<string, unknown>): Promise<void>;
|
|
4
|
+
export declare function buildMcpEntryWithAgent(agentId: string): McpServerEntry;
|
|
5
|
+
export declare function mergeMcpServerEntry(existing: Record<string, unknown>, serverKey: string, entry: McpServerEntry): {
|
|
6
|
+
config: Record<string, unknown>;
|
|
7
|
+
replaced: boolean;
|
|
8
|
+
};
|
|
9
|
+
export interface ContinueMcpServer {
|
|
10
|
+
name: string;
|
|
11
|
+
command: string;
|
|
12
|
+
args?: string[];
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export declare function readYamlConfig(path: string): Promise<Record<string, unknown>>;
|
|
16
|
+
export declare function writeYamlConfig(path: string, config: Record<string, unknown>): Promise<void>;
|
|
17
|
+
export declare function mergeContinueMcpServer(existing: Record<string, unknown>, entry: ContinueMcpServer): {
|
|
18
|
+
config: Record<string, unknown>;
|
|
19
|
+
replaced: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare function buildContinueMcpEntry(agentId: string): ContinueMcpServer;
|
|
22
|
+
export declare function hasStaleContinueEntry(configPath: string): Promise<boolean>;
|
|
23
|
+
export declare function removeContinueEntry(configPath: string): Promise<void>;
|
|
24
|
+
export declare function hasStaleMcpEntry(configPath: string, serverKey?: string): Promise<boolean>;
|
|
25
|
+
export declare function removeMcpEntry(configPath: string, serverKey?: string): Promise<void>;
|
|
26
|
+
export interface HookDef {
|
|
27
|
+
matcher?: string;
|
|
28
|
+
hooks: {
|
|
29
|
+
type: string;
|
|
30
|
+
command: string;
|
|
31
|
+
async: boolean;
|
|
32
|
+
}[];
|
|
33
|
+
}
|
|
34
|
+
export interface McpServerEntry {
|
|
35
|
+
command: string;
|
|
36
|
+
args?: string[];
|
|
37
|
+
env?: Record<string, string>;
|
|
38
|
+
}
|
|
39
|
+
export interface ClaudeSettings {
|
|
40
|
+
mcpServers?: Record<string, McpServerEntry>;
|
|
41
|
+
hooks?: Record<string, HookDef[]>;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export declare function hookScriptPath(): string;
|
|
45
|
+
export declare function generateHookScript(): string;
|
|
46
|
+
export declare function writeHookScript(): Promise<string>;
|
|
47
|
+
export declare function buildMcpEntry(): McpServerEntry;
|
|
48
|
+
export declare function buildHookEntries(): Record<string, HookDef[]>;
|
|
49
|
+
export declare function hasMcpServer(settings: ClaudeSettings): boolean;
|
|
50
|
+
export declare function isClaudeMcpRegistered(): boolean;
|
|
51
|
+
export declare function registerClaudeMcp(scope?: 'user' | 'project' | 'local'): {
|
|
52
|
+
replaced: boolean;
|
|
53
|
+
};
|
|
54
|
+
export declare function isCodexMcpRegistered(): boolean;
|
|
55
|
+
export declare function registerCodexMcp(agentId?: string): {
|
|
56
|
+
replaced: boolean;
|
|
57
|
+
};
|
|
58
|
+
export declare function hasHookIntegration(settings: ClaudeSettings): boolean;
|
|
59
|
+
export declare function mergeSettings(existing: ClaudeSettings, mode: IntegrationMode): {
|
|
60
|
+
settings: ClaudeSettings;
|
|
61
|
+
conflicts: string[];
|
|
62
|
+
};
|
|
63
|
+
export declare function resolveProjectRoot(): string;
|
|
64
|
+
export declare function readClaudeSettings(cwd: string): Promise<ClaudeSettings>;
|
|
65
|
+
export declare function writeClaudeSettings(cwd: string, settings: ClaudeSettings): Promise<void>;
|
|
66
|
+
export declare function detectLegacySetup(cwd: string): string[];
|