@dmsdc-ai/aigentry-brain 0.0.1
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/bin/aigentry-brain-mcp.mjs +17 -0
- package/bin/aigentry-brain-setup.mjs +17 -0
- package/bin/aigentry-brain.mjs +17 -0
- package/dist/audit/AuditTrail.d.ts +15 -0
- package/dist/audit/AuditTrail.js +43 -0
- package/dist/audit/AuditTrail.js.map +1 -0
- package/dist/backend/GitBackend.d.ts +27 -0
- package/dist/backend/GitBackend.js +201 -0
- package/dist/backend/GitBackend.js.map +1 -0
- package/dist/backend/SyncBackend.d.ts +13 -0
- package/dist/backend/SyncBackend.js +2 -0
- package/dist/backend/SyncBackend.js.map +1 -0
- package/dist/cli/AutoUpdater.d.ts +7 -0
- package/dist/cli/AutoUpdater.js +275 -0
- package/dist/cli/AutoUpdater.js.map +1 -0
- package/dist/cli/ConfigStore.d.ts +17 -0
- package/dist/cli/ConfigStore.js +50 -0
- package/dist/cli/ConfigStore.js.map +1 -0
- package/dist/cli/GhIntegration.d.ts +55 -0
- package/dist/cli/GhIntegration.js +192 -0
- package/dist/cli/GhIntegration.js.map +1 -0
- package/dist/cli/Prerequisites.d.ts +48 -0
- package/dist/cli/Prerequisites.js +182 -0
- package/dist/cli/Prerequisites.js.map +1 -0
- package/dist/cli/SetupWizard.d.ts +26 -0
- package/dist/cli/SetupWizard.js +407 -0
- package/dist/cli/SetupWizard.js.map +1 -0
- package/dist/cli/braincli.d.ts +2 -0
- package/dist/cli/braincli.js +260 -0
- package/dist/cli/braincli.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.js +238 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/context/ConfidenceGuard.d.ts +11 -0
- package/dist/context/ConfidenceGuard.js +32 -0
- package/dist/context/ConfidenceGuard.js.map +1 -0
- package/dist/context/ContextBudgetPolicy.d.ts +21 -0
- package/dist/context/ContextBudgetPolicy.js +136 -0
- package/dist/context/ContextBudgetPolicy.js.map +1 -0
- package/dist/context/ContextPacker.d.ts +30 -0
- package/dist/context/ContextPacker.js +219 -0
- package/dist/context/ContextPacker.js.map +1 -0
- package/dist/context/ContextRestoreService.d.ts +39 -0
- package/dist/context/ContextRestoreService.js +134 -0
- package/dist/context/ContextRestoreService.js.map +1 -0
- package/dist/contract/BrainContract.d.ts +93 -0
- package/dist/contract/BrainContract.js +245 -0
- package/dist/contract/BrainContract.js.map +1 -0
- package/dist/core/ContentDedup.d.ts +43 -0
- package/dist/core/ContentDedup.js +145 -0
- package/dist/core/ContentDedup.js.map +1 -0
- package/dist/core/EntityGraph.d.ts +66 -0
- package/dist/core/EntityGraph.js +196 -0
- package/dist/core/EntityGraph.js.map +1 -0
- package/dist/core/EntrySchema.d.ts +46 -0
- package/dist/core/EntrySchema.js +4 -0
- package/dist/core/EntrySchema.js.map +1 -0
- package/dist/core/GraphStore.d.ts +16 -0
- package/dist/core/GraphStore.js +29 -0
- package/dist/core/GraphStore.js.map +1 -0
- package/dist/core/MemoryDecay.d.ts +49 -0
- package/dist/core/MemoryDecay.js +113 -0
- package/dist/core/MemoryDecay.js.map +1 -0
- package/dist/core/ProfileFormat.d.ts +38 -0
- package/dist/core/ProfileFormat.js +254 -0
- package/dist/core/ProfileFormat.js.map +1 -0
- package/dist/core/ProfileManager.d.ts +80 -0
- package/dist/core/ProfileManager.js +269 -0
- package/dist/core/ProfileManager.js.map +1 -0
- package/dist/core/SchemaMigration.d.ts +12 -0
- package/dist/core/SchemaMigration.js +34 -0
- package/dist/core/SchemaMigration.js.map +1 -0
- package/dist/crypto/AgeCrypto.d.ts +26 -0
- package/dist/crypto/AgeCrypto.js +101 -0
- package/dist/crypto/AgeCrypto.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/BrainMcpServer.d.ts +13 -0
- package/dist/mcp/BrainMcpServer.js +223 -0
- package/dist/mcp/BrainMcpServer.js.map +1 -0
- package/dist/mcp/cli.d.ts +2 -0
- package/dist/mcp/cli.js +107 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/metrics/ResumeMetrics.d.ts +20 -0
- package/dist/metrics/ResumeMetrics.js +46 -0
- package/dist/metrics/ResumeMetrics.js.map +1 -0
- package/dist/peers/PeerStore.d.ts +17 -0
- package/dist/peers/PeerStore.js +65 -0
- package/dist/peers/PeerStore.js.map +1 -0
- package/dist/policy/PolicyEngine.d.ts +16 -0
- package/dist/policy/PolicyEngine.js +70 -0
- package/dist/policy/PolicyEngine.js.map +1 -0
- package/dist/policy/PolicyEnvelope.d.ts +7 -0
- package/dist/policy/PolicyEnvelope.js +2 -0
- package/dist/policy/PolicyEnvelope.js.map +1 -0
- package/dist/policy/RetentionParser.d.ts +6 -0
- package/dist/policy/RetentionParser.js +48 -0
- package/dist/policy/RetentionParser.js.map +1 -0
- package/dist/shared/AtomicWrite.d.ts +1 -0
- package/dist/shared/AtomicWrite.js +11 -0
- package/dist/shared/AtomicWrite.js.map +1 -0
- package/dist/shared/Clock.d.ts +11 -0
- package/dist/shared/Clock.js +17 -0
- package/dist/shared/Clock.js.map +1 -0
- package/dist/shared/Config.d.ts +15 -0
- package/dist/shared/Config.js +67 -0
- package/dist/shared/Config.js.map +1 -0
- package/dist/shared/Encryption.d.ts +19 -0
- package/dist/shared/Encryption.js +47 -0
- package/dist/shared/Encryption.js.map +1 -0
- package/dist/shared/Logger.d.ts +12 -0
- package/dist/shared/Logger.js +40 -0
- package/dist/shared/Logger.js.map +1 -0
- package/dist/shared/Mutex.d.ts +7 -0
- package/dist/shared/Mutex.js +34 -0
- package/dist/shared/Mutex.js.map +1 -0
- package/dist/shared/SetupErrors.d.ts +31 -0
- package/dist/shared/SetupErrors.js +155 -0
- package/dist/shared/SetupErrors.js.map +1 -0
- package/dist/status/SyncStatusStore.d.ts +17 -0
- package/dist/status/SyncStatusStore.js +48 -0
- package/dist/status/SyncStatusStore.js.map +1 -0
- package/dist/sync/AutoCommitter.d.ts +17 -0
- package/dist/sync/AutoCommitter.js +68 -0
- package/dist/sync/AutoCommitter.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +7 -0
- package/dist/sync/ConflictResolver.js +56 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/PushPullManager.d.ts +23 -0
- package/dist/sync/PushPullManager.js +155 -0
- package/dist/sync/PushPullManager.js.map +1 -0
- package/dist/sync/SyncEngine.d.ts +43 -0
- package/dist/sync/SyncEngine.js +145 -0
- package/dist/sync/SyncEngine.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
|
|
2
|
+
import { openSync, writeSync, closeSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { homedir, hostname } from 'node:os';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
/** Write directly to terminal, bypassing npm's output suppression */
|
|
7
|
+
function log(msg) {
|
|
8
|
+
const data = msg + '\n';
|
|
9
|
+
// Try /dev/tty first (works on Linux, macOS, and Git Bash/MINGW64)
|
|
10
|
+
for (const ttyPath of ['/dev/tty', 'CON']) {
|
|
11
|
+
try {
|
|
12
|
+
const fd = openSync(ttyPath, 'w');
|
|
13
|
+
writeSync(fd, data);
|
|
14
|
+
closeSync(fd);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
catch { /* try next */ }
|
|
18
|
+
}
|
|
19
|
+
process.stderr.write(data);
|
|
20
|
+
}
|
|
21
|
+
import { readConfig, writeConfig, updateConfig, createDefaultConfig, } from './ConfigStore.js';
|
|
22
|
+
import { checkAllPrereqs, installGhCli, ensureAgeKey } from './Prerequisites.js';
|
|
23
|
+
import { findExistingProfileRepo, createPrivateRepo, setupGitCredentials, getCloneUrl, findProfileRepoViaGit, } from './GhIntegration.js';
|
|
24
|
+
import { registerGemini, registerCodex } from './setup.js';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Internal helpers
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
async function pathExists(p) {
|
|
29
|
+
try {
|
|
30
|
+
await access(p);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function readMcpConfig(mcpConfigPath) {
|
|
38
|
+
if (!(await pathExists(mcpConfigPath))) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const raw = await readFile(mcpConfigPath, 'utf8');
|
|
43
|
+
return JSON.parse(raw);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function writeMcpConfig(mcpConfigPath, config) {
|
|
50
|
+
const dir = dirname(mcpConfigPath);
|
|
51
|
+
await mkdir(dir, { recursive: true });
|
|
52
|
+
await writeFile(mcpConfigPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
53
|
+
}
|
|
54
|
+
function resolveDefaultMcpCliPath() {
|
|
55
|
+
try {
|
|
56
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
57
|
+
const __dirname = dirname(__filename);
|
|
58
|
+
return join(__dirname, '..', 'mcp', 'cli.js');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return join(homedir(), '.aigentry', 'cli.js');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function makeStepResult(step, name, success, message, skipped = false) {
|
|
65
|
+
return { step, name, success, message, skipped };
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// 7 setup steps
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
async function stepPrereqs() {
|
|
71
|
+
const STEP = 1;
|
|
72
|
+
const NAME = 'Prerequisites';
|
|
73
|
+
try {
|
|
74
|
+
const report = await checkAllPrereqs();
|
|
75
|
+
const nodeResult = report.results.find((r) => r.name === 'node');
|
|
76
|
+
const gitResult = report.results.find((r) => r.name === 'git');
|
|
77
|
+
const versions = report.results
|
|
78
|
+
.filter((r) => r.installed && r.version)
|
|
79
|
+
.map((r) => `${r.name} v${r.version}`)
|
|
80
|
+
.join(', ');
|
|
81
|
+
if (!nodeResult?.satisfied || !gitResult?.satisfied) {
|
|
82
|
+
const failed = report.results
|
|
83
|
+
.filter((r) => !r.satisfied)
|
|
84
|
+
.map((r) => r.message)
|
|
85
|
+
.join('; ');
|
|
86
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... FAILED: ${failed}`);
|
|
87
|
+
return {
|
|
88
|
+
result: makeStepResult(STEP, NAME, false, `Required tools not satisfied: ${failed}`),
|
|
89
|
+
report,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ✅ ${versions}`);
|
|
93
|
+
return {
|
|
94
|
+
result: makeStepResult(STEP, NAME, true, `${versions}`),
|
|
95
|
+
report,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... FAILED: ${msg}`);
|
|
101
|
+
return {
|
|
102
|
+
result: makeStepResult(STEP, NAME, false, msg),
|
|
103
|
+
report: null,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function stepProfileRepo(ghAuthenticated, repoName) {
|
|
108
|
+
const STEP = 2;
|
|
109
|
+
const NAME = 'Profile repo';
|
|
110
|
+
if (!ghAuthenticated) {
|
|
111
|
+
// Fallback: try git credential manager
|
|
112
|
+
try {
|
|
113
|
+
const found = await findProfileRepoViaGit(repoName);
|
|
114
|
+
if (found) {
|
|
115
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ✅ found via git credentials (${found.username}/${repoName})`);
|
|
116
|
+
return {
|
|
117
|
+
result: makeStepResult(STEP, NAME, true, `connected via git-credential — ${found.url}`),
|
|
118
|
+
remoteUrl: found.url,
|
|
119
|
+
authMethod: 'git-credential',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* ignore fallback errors */ }
|
|
124
|
+
const msg = '⚠️ gh not authenticated and no git credentials found. Running in offline mode. Run \'aigentry-brain-setup --enable-sync\' later.';
|
|
125
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ${msg}`);
|
|
126
|
+
return {
|
|
127
|
+
result: makeStepResult(STEP, NAME, true, 'offline mode — no credentials found'),
|
|
128
|
+
remoteUrl: null,
|
|
129
|
+
authMethod: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
// Try to find an existing profile repo first
|
|
134
|
+
let repo = await findExistingProfileRepo();
|
|
135
|
+
let alreadyExisted = false;
|
|
136
|
+
if (repo) {
|
|
137
|
+
alreadyExisted = true;
|
|
138
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ✅ existing profile found, connecting (${repo.fullName})`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const createResult = await createPrivateRepo(repoName);
|
|
142
|
+
if (!createResult.success || !createResult.repo) {
|
|
143
|
+
const errMsg = createResult.error ?? 'unknown error creating repo';
|
|
144
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ⚠️ could not create repo: ${errMsg}. Continuing in offline mode.`);
|
|
145
|
+
return {
|
|
146
|
+
result: makeStepResult(STEP, NAME, true, `repo creation failed (${errMsg}), offline mode`),
|
|
147
|
+
remoteUrl: null,
|
|
148
|
+
authMethod: null,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
repo = createResult.repo;
|
|
152
|
+
alreadyExisted = createResult.alreadyExists;
|
|
153
|
+
}
|
|
154
|
+
// Set up git credentials
|
|
155
|
+
await setupGitCredentials();
|
|
156
|
+
// Get clone URL based on user's protocol preference
|
|
157
|
+
const cloneUrl = await getCloneUrl(repoName);
|
|
158
|
+
const label = alreadyExisted ? 'connected to existing' : 'created';
|
|
159
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ✅ ${repoName} ${label}`);
|
|
160
|
+
return {
|
|
161
|
+
result: makeStepResult(STEP, NAME, true, `${repoName} ${label} — ${cloneUrl}`),
|
|
162
|
+
remoteUrl: cloneUrl,
|
|
163
|
+
authMethod: 'gh-cli',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
168
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ⚠️ ${msg}. Continuing in offline mode.`);
|
|
169
|
+
return {
|
|
170
|
+
result: makeStepResult(STEP, NAME, true, `error: ${msg}, offline mode`),
|
|
171
|
+
remoteUrl: null,
|
|
172
|
+
authMethod: null,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function stepEncryption(_profileRepoPath) {
|
|
177
|
+
const STEP = 3;
|
|
178
|
+
const NAME = 'Encryption';
|
|
179
|
+
try {
|
|
180
|
+
// Ensure age key exists (uses age-encryption npm — no external binary needed)
|
|
181
|
+
const result = await ensureAgeKey();
|
|
182
|
+
const keyStatus = result.generated ? 'generated new key' : 'existing key found';
|
|
183
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ✅ ${keyStatus} (age-encryption npm)`);
|
|
184
|
+
return makeStepResult(STEP, NAME, true, `${keyStatus}, public key: ${result.recipient.slice(0, 20)}...`);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
188
|
+
log(`[aigentry-brain] [${STEP}/7] ${NAME}... ⚠️ ${msg}. Encryption disabled.`);
|
|
189
|
+
return makeStepResult(STEP, NAME, true, `encryption setup failed: ${msg}`, true);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function stepSaveConfig(configPath, deviceId, repoName, remoteUrl, authMethod) {
|
|
193
|
+
const STEP = 4;
|
|
194
|
+
const NAME = 'Config';
|
|
195
|
+
try {
|
|
196
|
+
const existing = await readConfig(configPath);
|
|
197
|
+
const base = existing ?? createDefaultConfig(deviceId);
|
|
198
|
+
const config = {
|
|
199
|
+
...base,
|
|
200
|
+
version: 1,
|
|
201
|
+
deviceId,
|
|
202
|
+
repoName,
|
|
203
|
+
remoteUrl,
|
|
204
|
+
authMethod,
|
|
205
|
+
setupStep: 'config_saved',
|
|
206
|
+
};
|
|
207
|
+
await writeConfig(config, configPath);
|
|
208
|
+
log(`[aigentry-brain] [${STEP}/7] Config... ✅ ${configPath} saved`);
|
|
209
|
+
return {
|
|
210
|
+
result: makeStepResult(STEP, NAME, true, `${configPath} saved`),
|
|
211
|
+
config,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
216
|
+
log(`[aigentry-brain] [${STEP}/7] Config... FAILED: ${msg}`);
|
|
217
|
+
return {
|
|
218
|
+
result: makeStepResult(STEP, NAME, false, msg),
|
|
219
|
+
config: null,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function stepMcpEnv(mcpConfigPath, mcpCliPath, remoteUrl, deviceId, geminiConfigPath, codexConfigPath) {
|
|
224
|
+
const STEP = 5;
|
|
225
|
+
const NAME = 'MCP env';
|
|
226
|
+
try {
|
|
227
|
+
// Build env object for all configs
|
|
228
|
+
const env = {};
|
|
229
|
+
env['BRAIN_DEVICE_ID'] = deviceId;
|
|
230
|
+
if (remoteUrl) {
|
|
231
|
+
env['BRAIN_REMOTE_URL'] = remoteUrl;
|
|
232
|
+
}
|
|
233
|
+
// --- Claude (.mcp.json) ---
|
|
234
|
+
const mcpConfig = await readMcpConfig(mcpConfigPath);
|
|
235
|
+
if (!mcpConfig.mcpServers) {
|
|
236
|
+
mcpConfig.mcpServers = {};
|
|
237
|
+
}
|
|
238
|
+
const existing = mcpConfig.mcpServers['aigentry-brain'];
|
|
239
|
+
const entry = existing
|
|
240
|
+
? { ...existing }
|
|
241
|
+
: { command: 'node', args: [mcpCliPath] };
|
|
242
|
+
// Merge env, removing stale BRAIN_REMOTE_URL if offline
|
|
243
|
+
const mergedEnv = { ...(entry.env ?? {}), ...env };
|
|
244
|
+
if (!remoteUrl) {
|
|
245
|
+
delete mergedEnv['BRAIN_REMOTE_URL'];
|
|
246
|
+
}
|
|
247
|
+
entry.env = mergedEnv;
|
|
248
|
+
mcpConfig.mcpServers['aigentry-brain'] = entry;
|
|
249
|
+
await writeMcpConfig(mcpConfigPath, mcpConfig);
|
|
250
|
+
// --- Gemini (settings.json) ---
|
|
251
|
+
await registerGemini(geminiConfigPath, mcpCliPath, env);
|
|
252
|
+
// --- Codex (config.toml) ---
|
|
253
|
+
await registerCodex(codexConfigPath, mcpCliPath, env);
|
|
254
|
+
log(`[aigentry-brain] [${STEP}/7] MCP env... ✅ .mcp.json, settings.json, config.toml updated`);
|
|
255
|
+
return makeStepResult(STEP, NAME, true, '.mcp.json, settings.json, config.toml updated with env');
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
259
|
+
log(`[aigentry-brain] [${STEP}/7] MCP env... FAILED: ${msg}`);
|
|
260
|
+
return makeStepResult(STEP, NAME, false, msg);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async function stepInitialSync(remoteUrl) {
|
|
264
|
+
const STEP = 6;
|
|
265
|
+
const NAME = 'Initial sync';
|
|
266
|
+
if (!remoteUrl) {
|
|
267
|
+
log(`[aigentry-brain] [${STEP}/7] Initial sync... ⏭️ skipped (offline mode)`);
|
|
268
|
+
return makeStepResult(STEP, NAME, true, 'skipped (offline mode)', true);
|
|
269
|
+
}
|
|
270
|
+
// Just validate the URL is reachable in concept — actual sync happens when MCP starts
|
|
271
|
+
log(`[aigentry-brain] [${STEP}/7] Initial sync... ✅ ready (sync starts when Claude Code restarts)`);
|
|
272
|
+
return makeStepResult(STEP, NAME, true, `ready — sync starts when Claude Code restarts`);
|
|
273
|
+
}
|
|
274
|
+
async function stepHealthCheck(configPath, mcpConfigPath) {
|
|
275
|
+
const STEP = 7;
|
|
276
|
+
const NAME = 'Health check';
|
|
277
|
+
try {
|
|
278
|
+
const config = await readConfig(configPath);
|
|
279
|
+
if (!config) {
|
|
280
|
+
const msg = `config.json not found at ${configPath}`;
|
|
281
|
+
log(`[aigentry-brain] [${STEP}/7] Health check... FAILED: ${msg}`);
|
|
282
|
+
return { result: makeStepResult(STEP, NAME, false, msg), config: null };
|
|
283
|
+
}
|
|
284
|
+
const mcpConfig = await readMcpConfig(mcpConfigPath);
|
|
285
|
+
if (!mcpConfig.mcpServers?.['aigentry-brain']) {
|
|
286
|
+
const msg = `MCP entry 'aigentry-brain' not found in ${mcpConfigPath}`;
|
|
287
|
+
log(`[aigentry-brain] [${STEP}/7] Health check... FAILED: ${msg}`);
|
|
288
|
+
return { result: makeStepResult(STEP, NAME, false, msg), config };
|
|
289
|
+
}
|
|
290
|
+
// Mark complete
|
|
291
|
+
const finalConfig = await updateConfig({ setupComplete: true, setupStep: 'complete' }, configPath);
|
|
292
|
+
log(`[aigentry-brain] [${STEP}/7] Health check... ✅ all good`);
|
|
293
|
+
return { result: makeStepResult(STEP, NAME, true, 'all good'), config: finalConfig };
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
297
|
+
log(`[aigentry-brain] [${STEP}/7] Health check... FAILED: ${msg}`);
|
|
298
|
+
return { result: makeStepResult(STEP, NAME, false, msg), config: null };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// Main wizard entry point
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
export async function runSetupWizard(options) {
|
|
305
|
+
const repoName = options?.repoName ?? 'aigentry-brain-profile';
|
|
306
|
+
const deviceId = options?.deviceId ?? `device-${hostname()}`;
|
|
307
|
+
const profileDir = options?.profileDir ?? join(homedir(), '.aigentry');
|
|
308
|
+
const configPath = options?.configPath ?? join(profileDir, 'config.json');
|
|
309
|
+
const mcpConfigPath = options?.mcpConfigPath ?? join(homedir(), '.claude', '.mcp.json');
|
|
310
|
+
const mcpCliPath = options?.mcpCliPath ?? resolveDefaultMcpCliPath();
|
|
311
|
+
const geminiConfigPath = options?.geminiConfigPath ?? join(homedir(), '.gemini', 'settings.json');
|
|
312
|
+
const codexConfigPath = options?.codexConfigPath ?? join(homedir(), '.codex', 'config.toml');
|
|
313
|
+
const steps = [];
|
|
314
|
+
// --- Step 1: Prerequisites ---
|
|
315
|
+
const { result: step1, report: prereqReport } = await stepPrereqs();
|
|
316
|
+
steps.push(step1);
|
|
317
|
+
if (!step1.success) {
|
|
318
|
+
return {
|
|
319
|
+
success: false,
|
|
320
|
+
steps,
|
|
321
|
+
config: null,
|
|
322
|
+
message: `Setup failed at step 1 (prerequisites): ${step1.message}`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
let ghAuthenticated = prereqReport?.ghAuthenticated ?? false;
|
|
326
|
+
// If gh is not installed, try auto-installing it
|
|
327
|
+
if (!ghAuthenticated) {
|
|
328
|
+
const ghResult = prereqReport?.results.find(r => r.name === 'gh');
|
|
329
|
+
if (!ghResult?.installed) {
|
|
330
|
+
log('[aigentry-brain] gh CLI not found. Attempting auto-install...');
|
|
331
|
+
const installResult = await installGhCli();
|
|
332
|
+
if (installResult.installed) {
|
|
333
|
+
log(`[aigentry-brain] ✅ ${installResult.message}`);
|
|
334
|
+
// Re-check prereqs after install
|
|
335
|
+
const recheck = await checkAllPrereqs();
|
|
336
|
+
ghAuthenticated = recheck.ghAuthenticated;
|
|
337
|
+
if (!ghAuthenticated) {
|
|
338
|
+
log('[aigentry-brain] gh installed but not authenticated. Run: gh auth login');
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
log(`[aigentry-brain] ⚠️ ${installResult.message}. Continuing without gh.`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Check if already fully set up
|
|
347
|
+
const existingConfig = await readConfig(configPath);
|
|
348
|
+
if (existingConfig?.setupComplete) {
|
|
349
|
+
// Still run health check to update env if needed
|
|
350
|
+
log('[aigentry-brain] Already set up — verifying health...');
|
|
351
|
+
}
|
|
352
|
+
// --- Step 2: Profile repo ---
|
|
353
|
+
const { result: step2, remoteUrl, authMethod } = await stepProfileRepo(ghAuthenticated, repoName);
|
|
354
|
+
steps.push(step2);
|
|
355
|
+
// Step 2 never aborts — continues in offline mode on failure
|
|
356
|
+
// --- Step 3: Encryption setup ---
|
|
357
|
+
// Determine profile repo path for .sops.yaml placement
|
|
358
|
+
// Note: repo may not be cloned yet (clone happens on first MCP start).
|
|
359
|
+
// GitBackend.init() will also create .sops.yaml after clone as a safety net.
|
|
360
|
+
const profileRepoPath = join(profileDir, 'repo');
|
|
361
|
+
const step3 = await stepEncryption(profileRepoPath);
|
|
362
|
+
steps.push(step3);
|
|
363
|
+
// --- Step 4: Config save (critical) ---
|
|
364
|
+
const { result: step4, config: savedConfig } = await stepSaveConfig(configPath, deviceId, repoName, remoteUrl, authMethod);
|
|
365
|
+
steps.push(step4);
|
|
366
|
+
if (!step4.success) {
|
|
367
|
+
return {
|
|
368
|
+
success: false,
|
|
369
|
+
steps,
|
|
370
|
+
config: null,
|
|
371
|
+
message: `Setup failed at step 4 (config): ${step4.message}`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
// --- Step 5: MCP env update ---
|
|
375
|
+
const step5 = await stepMcpEnv(mcpConfigPath, mcpCliPath, remoteUrl, deviceId, geminiConfigPath, codexConfigPath);
|
|
376
|
+
steps.push(step5);
|
|
377
|
+
// Non-critical: continue even if fails
|
|
378
|
+
// --- Step 6: Initial sync ---
|
|
379
|
+
const step6 = await stepInitialSync(remoteUrl);
|
|
380
|
+
steps.push(step6);
|
|
381
|
+
// --- Step 7: Health check ---
|
|
382
|
+
const { result: step7, config: finalConfig } = await stepHealthCheck(configPath, mcpConfigPath);
|
|
383
|
+
steps.push(step7);
|
|
384
|
+
const allCriticalPassed = step1.success && step4.success;
|
|
385
|
+
const overallSuccess = allCriticalPassed && step7.success;
|
|
386
|
+
let message;
|
|
387
|
+
if (overallSuccess) {
|
|
388
|
+
if (remoteUrl) {
|
|
389
|
+
message = `🎉 Setup complete! Restart Claude Code to activate. Your profile syncs to: ${remoteUrl}`;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
message = `🎉 Setup complete (offline mode). Run 'aigentry-brain-setup --enable-sync' to enable cross-machine sync.`;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
const failedSteps = steps.filter((s) => !s.success && !s.skipped).map((s) => s.name).join(', ');
|
|
397
|
+
message = `Setup completed with issues in: ${failedSteps}`;
|
|
398
|
+
}
|
|
399
|
+
log(`[aigentry-brain] ${message}`);
|
|
400
|
+
return {
|
|
401
|
+
success: overallSuccess,
|
|
402
|
+
steps,
|
|
403
|
+
config: finalConfig ?? savedConfig,
|
|
404
|
+
message,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=SetupWizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SetupWizard.js","sourceRoot":"","sources":["../../src/cli/SetupWizard.ts"],"names":[],"mappings":"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"}
|