termify-agent 1.0.39 → 1.0.41
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/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +2 -0
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +55 -0
- package/dist/auth.js.map +1 -1
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +26 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/pty-manager.d.ts +19 -0
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +111 -0
- package/dist/pty-manager.js.map +1 -1
- package/dist/setup.d.ts +15 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +603 -0
- package/dist/setup.js.map +1 -0
- package/hooks/termify-response.js +151 -124
- package/hooks/termify-sync.js +165 -116
- package/mcp/memsearch-mcp-server.mjs +149 -0
- package/package.json +3 -2
- package/plugins/context7/.claude-plugin/plugin.json +7 -0
- package/plugins/context7/.mcp.json +6 -0
- package/plugins/memsearch/.claude-plugin/plugin.json +5 -0
- package/plugins/memsearch/README.md +762 -0
- package/plugins/memsearch/hooks/common.sh +151 -0
- package/plugins/memsearch/hooks/hooks.json +50 -0
- package/plugins/memsearch/hooks/parse-transcript.sh +117 -0
- package/plugins/memsearch/hooks/session-end.sh +9 -0
- package/plugins/memsearch/hooks/session-start.sh +119 -0
- package/plugins/memsearch/hooks/stop.sh +117 -0
- package/plugins/memsearch/hooks/user-prompt-submit.sh +21 -0
- package/plugins/memsearch/scripts/derive-collection.sh +50 -0
- package/plugins/memsearch/skills/memory-recall/SKILL.md +42 -0
- package/scripts/postinstall.js +21 -483
package/dist/setup.js
ADDED
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Termify Agent - First Run Setup
|
|
3
|
+
*
|
|
4
|
+
* Runs on first `termify-agent start` (per version) to:
|
|
5
|
+
* 1. Install AI CLI tools (Claude Code, Codex, Gemini CLI)
|
|
6
|
+
* 2. Configure MCP + hooks for each CLI
|
|
7
|
+
* 3. Update AI instructions in CLAUDE.md / instructions.md
|
|
8
|
+
*
|
|
9
|
+
* Results are cached via marker file — skipped on subsequent starts.
|
|
10
|
+
*/
|
|
11
|
+
import { execFileSync } from 'child_process';
|
|
12
|
+
import { existsSync, mkdirSync, copyFileSync, readFileSync, writeFileSync, unlinkSync, readdirSync, statSync, } from 'fs';
|
|
13
|
+
import { join, dirname } from 'path';
|
|
14
|
+
import { homedir, platform } from 'os';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import ora from 'ora';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
const __setupFile = fileURLToPath(import.meta.url);
|
|
19
|
+
const __setupDir = dirname(__setupFile);
|
|
20
|
+
const PKG_ROOT = join(__setupDir, '..');
|
|
21
|
+
const TERMIFY_DIR = join(homedir(), '.termify');
|
|
22
|
+
const MCP_DIR = join(TERMIFY_DIR, 'termify-mcp');
|
|
23
|
+
const MCP_BUNDLE_PATH = join(MCP_DIR, 'index.mjs');
|
|
24
|
+
const IS_WIN = platform() === 'win32';
|
|
25
|
+
const MEMSEARCH_DIR = join(homedir(), '.memsearch');
|
|
26
|
+
const MEMSEARCH_CONFIG = join(MEMSEARCH_DIR, 'config.toml');
|
|
27
|
+
const MEMSEARCH_MCP_DIR = join(TERMIFY_DIR, 'memsearch-mcp');
|
|
28
|
+
const MEMSEARCH_MCP_PATH = join(MEMSEARCH_MCP_DIR, 'server.mjs');
|
|
29
|
+
const PLUGINS_DIR = join(homedir(), '.claude', 'plugins');
|
|
30
|
+
const PLUGINS_CACHE_DIR = join(PLUGINS_DIR, 'cache');
|
|
31
|
+
const AUTO_PLUGINS = [
|
|
32
|
+
{
|
|
33
|
+
marketplace: 'memsearch-plugins',
|
|
34
|
+
name: 'memsearch',
|
|
35
|
+
version: '0.1.0',
|
|
36
|
+
bundlePath: 'memsearch',
|
|
37
|
+
pluginId: 'memsearch@memsearch-plugins',
|
|
38
|
+
marketplaceSource: { source: 'github', repo: 'zilliztech/memsearch' },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
marketplace: 'claude-plugins-official',
|
|
42
|
+
name: 'context7',
|
|
43
|
+
version: '55b58ec6e564',
|
|
44
|
+
bundlePath: 'context7',
|
|
45
|
+
pluginId: 'context7@claude-plugins-official',
|
|
46
|
+
marketplaceSource: { source: 'github', repo: 'anthropics/claude-plugins-official' },
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
function getVersion() {
|
|
50
|
+
return JSON.parse(readFileSync(join(PKG_ROOT, 'package.json'), 'utf8')).version;
|
|
51
|
+
}
|
|
52
|
+
function getSetupMarkerPath() {
|
|
53
|
+
return join(TERMIFY_DIR, `.setup-v${getVersion()}`);
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// CLI tool definitions
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const CLI_TOOLS = [
|
|
59
|
+
{ name: 'Claude Code', command: 'claude', pkg: '@anthropic-ai/claude-code' },
|
|
60
|
+
{ name: 'Codex CLI', command: 'codex', pkg: '@openai/codex' },
|
|
61
|
+
{ name: 'Gemini CLI', command: 'gemini', pkg: '@google/gemini-cli' },
|
|
62
|
+
];
|
|
63
|
+
const HOOK_DEFINITIONS = {
|
|
64
|
+
claude: {
|
|
65
|
+
UserPromptSubmit: ['termify-sync.js'],
|
|
66
|
+
Stop: ['termify-response.js'],
|
|
67
|
+
PreToolUse: [
|
|
68
|
+
{ file: 'termify-tool-hook.js' },
|
|
69
|
+
{ file: 'termify-question-hook.js', matcher: 'AskUserQuestion' },
|
|
70
|
+
{ file: 'termify-needs-input-hook.js', matcher: 'ExitPlanMode' },
|
|
71
|
+
{ file: 'termify-needs-input-hook.js', matcher: 'EnterPlanMode' },
|
|
72
|
+
],
|
|
73
|
+
PostToolUse: ['termify-tool-hook.js'],
|
|
74
|
+
},
|
|
75
|
+
gemini: {
|
|
76
|
+
BeforeAgent: ['termify-sync.js'],
|
|
77
|
+
AfterAgent: ['termify-response.js'],
|
|
78
|
+
},
|
|
79
|
+
codex: {
|
|
80
|
+
notify: ['termify-codex-notify.js'],
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const HOOK_FILES = [
|
|
84
|
+
'termify-sync.js',
|
|
85
|
+
'termify-response.js',
|
|
86
|
+
'termify-tool-hook.js',
|
|
87
|
+
'termify-question-hook.js',
|
|
88
|
+
'termify-needs-input-hook.js',
|
|
89
|
+
'termify-codex-notify.js',
|
|
90
|
+
];
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Public API
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
/** Returns true if setup has not yet run for the current version. */
|
|
95
|
+
export function needsSetup() {
|
|
96
|
+
return !existsSync(getSetupMarkerPath());
|
|
97
|
+
}
|
|
98
|
+
/** Run first-time setup with animated spinners. Skips if already done. */
|
|
99
|
+
export async function runSetup() {
|
|
100
|
+
if (!needsSetup())
|
|
101
|
+
return;
|
|
102
|
+
const version = getVersion();
|
|
103
|
+
console.log('');
|
|
104
|
+
console.log(chalk.bold.cyan(' Termify Agent') + chalk.dim(` — setup v${version}`));
|
|
105
|
+
console.log('');
|
|
106
|
+
// Step 1: Install CLI tools
|
|
107
|
+
for (const cli of CLI_TOOLS) {
|
|
108
|
+
await installCli(cli);
|
|
109
|
+
}
|
|
110
|
+
// Step 2: Configure MCP + hooks
|
|
111
|
+
const s2 = ora({ text: 'Configuring hooks & MCP...', indent: 2 }).start();
|
|
112
|
+
try {
|
|
113
|
+
installTermifyMcp();
|
|
114
|
+
s2.succeed(chalk.green('Hooks & MCP configured') + chalk.dim(' (Claude · Gemini · Codex)'));
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const msg = err instanceof Error ? err.message : 'unknown error';
|
|
118
|
+
s2.warn(`Hooks & MCP: ${msg}`);
|
|
119
|
+
}
|
|
120
|
+
// Step 2b: Install memsearch binary
|
|
121
|
+
const s2b = ora({ text: 'Installing memsearch binary...', indent: 2 }).start();
|
|
122
|
+
try {
|
|
123
|
+
installMemsearchBinary();
|
|
124
|
+
s2b.succeed(chalk.green('memsearch binary installed'));
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const msg = err instanceof Error ? err.message : 'unknown error';
|
|
128
|
+
s2b.warn(`memsearch binary: ${msg} ${chalk.dim('(plugin will use uvx fallback)')}`);
|
|
129
|
+
}
|
|
130
|
+
// Step 2c: Configure memsearch & plugins
|
|
131
|
+
const s2c = ora({ text: 'Configuring memsearch & plugins...', indent: 2 }).start();
|
|
132
|
+
try {
|
|
133
|
+
writeMemsearchConfig();
|
|
134
|
+
installMemsearchMcp();
|
|
135
|
+
installPlugins();
|
|
136
|
+
s2c.succeed(chalk.green('Plugins configured') + chalk.dim(' (memsearch · context7)'));
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
const msg = err instanceof Error ? err.message : 'unknown error';
|
|
140
|
+
s2c.warn(`Plugins: ${msg}`);
|
|
141
|
+
}
|
|
142
|
+
// Step 3: AI instructions
|
|
143
|
+
const s3 = ora({ text: 'Updating AI instructions...', indent: 2 }).start();
|
|
144
|
+
try {
|
|
145
|
+
ensureClaudeInstructions();
|
|
146
|
+
ensureCodexInstructions();
|
|
147
|
+
s3.succeed(chalk.green('AI instructions updated'));
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
const msg = err instanceof Error ? err.message : 'unknown error';
|
|
151
|
+
s3.warn(`Instructions: ${msg}`);
|
|
152
|
+
}
|
|
153
|
+
// Write version marker
|
|
154
|
+
mkdirSync(TERMIFY_DIR, { recursive: true });
|
|
155
|
+
writeFileSync(getSetupMarkerPath(), Date.now().toString());
|
|
156
|
+
console.log('');
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// CLI installation helpers
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
function isCliInstalled(command) {
|
|
162
|
+
try {
|
|
163
|
+
const bin = IS_WIN ? 'where' : 'which';
|
|
164
|
+
execFileSync(bin, [command], { stdio: 'pipe' });
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function installCli(cli) {
|
|
172
|
+
if (isCliInstalled(cli.command)) {
|
|
173
|
+
console.log(` ${chalk.green('\u2714')} ${cli.name} ${chalk.dim('found')}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const spinner = ora({ text: `Installing ${cli.name}...`, indent: 2 }).start();
|
|
177
|
+
try {
|
|
178
|
+
execFileSync('npm', ['install', '-g', cli.pkg], {
|
|
179
|
+
stdio: 'pipe',
|
|
180
|
+
timeout: 180_000,
|
|
181
|
+
});
|
|
182
|
+
spinner.succeed(chalk.green(`${cli.name} installed`));
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
spinner.warn(`${cli.name} skipped ${chalk.dim(`(npm i -g ${cli.pkg})`)}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// MCP + hooks
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
function installTermifyMcp() {
|
|
192
|
+
const bundledMcp = join(PKG_ROOT, 'mcp', 'termify-mcp-bundle.mjs');
|
|
193
|
+
if (!existsSync(bundledMcp)) {
|
|
194
|
+
throw new Error('termify-mcp bundle not found in package');
|
|
195
|
+
}
|
|
196
|
+
mkdirSync(MCP_DIR, { recursive: true });
|
|
197
|
+
copyFileSync(bundledMcp, MCP_BUNDLE_PATH);
|
|
198
|
+
configureClaudeCode(MCP_BUNDLE_PATH);
|
|
199
|
+
configureCodex(MCP_BUNDLE_PATH);
|
|
200
|
+
configureGemini();
|
|
201
|
+
}
|
|
202
|
+
function installHookFiles() {
|
|
203
|
+
const srcDir = join(PKG_ROOT, 'hooks');
|
|
204
|
+
const destDir = join(TERMIFY_DIR, 'hooks');
|
|
205
|
+
mkdirSync(destDir, { recursive: true });
|
|
206
|
+
for (const file of HOOK_FILES) {
|
|
207
|
+
const src = join(srcDir, file);
|
|
208
|
+
const dest = join(destDir, file);
|
|
209
|
+
if (existsSync(src)) {
|
|
210
|
+
copyFileSync(src, dest);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Clean up old hook from previous versions
|
|
214
|
+
const oldHook = join(destDir, 'termify-auto-working.js');
|
|
215
|
+
if (existsSync(oldHook)) {
|
|
216
|
+
try {
|
|
217
|
+
unlinkSync(oldHook);
|
|
218
|
+
}
|
|
219
|
+
catch { /* ignore */ }
|
|
220
|
+
}
|
|
221
|
+
return destDir;
|
|
222
|
+
}
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Claude Code configuration
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
function configureClaudeCode(mcpPath) {
|
|
227
|
+
const claudeDir = join(homedir(), '.claude');
|
|
228
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
229
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
230
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
231
|
+
let settings = {};
|
|
232
|
+
if (existsSync(settingsPath)) {
|
|
233
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
234
|
+
}
|
|
235
|
+
// MCP server
|
|
236
|
+
if (!settings.mcpServers)
|
|
237
|
+
settings.mcpServers = {};
|
|
238
|
+
delete settings.mcpServers['termify'];
|
|
239
|
+
settings.mcpServers['termify-status'] = { command: 'node', args: [mcpPath] };
|
|
240
|
+
// Install hook files
|
|
241
|
+
const hooksDestDir = installHookFiles();
|
|
242
|
+
// Clean up ALL existing termify hooks (prevents duplicates across paths)
|
|
243
|
+
if (settings.hooks) {
|
|
244
|
+
for (const eventName of Object.keys(settings.hooks)) {
|
|
245
|
+
if (Array.isArray(settings.hooks[eventName])) {
|
|
246
|
+
settings.hooks[eventName] = settings.hooks[eventName].filter(
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
248
|
+
(h) => !h.hooks || !h.hooks.some((hh) => hh.command && /termify-/.test(hh.command)));
|
|
249
|
+
if (settings.hooks[eventName].length === 0) {
|
|
250
|
+
delete settings.hooks[eventName];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Register Claude Code hooks
|
|
256
|
+
if (!settings.hooks)
|
|
257
|
+
settings.hooks = {};
|
|
258
|
+
const claudeHooks = HOOK_DEFINITIONS.claude;
|
|
259
|
+
for (const [eventName, hooks] of Object.entries(claudeHooks)) {
|
|
260
|
+
if (!settings.hooks[eventName])
|
|
261
|
+
settings.hooks[eventName] = [];
|
|
262
|
+
for (const hook of hooks) {
|
|
263
|
+
const file = typeof hook === 'string' ? hook : hook.file;
|
|
264
|
+
const matcher = typeof hook === 'object' ? hook.matcher : null;
|
|
265
|
+
const hookPath = join(hooksDestDir, file);
|
|
266
|
+
const hookCommand = `node ${hookPath}`;
|
|
267
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
|
+
const entry = {
|
|
269
|
+
hooks: [{ type: 'command', command: hookCommand }],
|
|
270
|
+
};
|
|
271
|
+
if (matcher) {
|
|
272
|
+
entry.matcher = matcher;
|
|
273
|
+
}
|
|
274
|
+
settings.hooks[eventName].push(entry);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Enable auto-installed plugins
|
|
278
|
+
if (!settings.enabledPlugins)
|
|
279
|
+
settings.enabledPlugins = {};
|
|
280
|
+
for (const plugin of AUTO_PLUGINS) {
|
|
281
|
+
if (settings.enabledPlugins[plugin.pluginId] === undefined) {
|
|
282
|
+
settings.enabledPlugins[plugin.pluginId] = true;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
286
|
+
}
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
// Gemini CLI configuration
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
function configureGemini() {
|
|
291
|
+
const geminiDir = join(homedir(), '.gemini');
|
|
292
|
+
if (!existsSync(geminiDir))
|
|
293
|
+
return;
|
|
294
|
+
const settingsPath = join(geminiDir, 'settings.json');
|
|
295
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
296
|
+
let settings = {};
|
|
297
|
+
if (existsSync(settingsPath)) {
|
|
298
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
299
|
+
}
|
|
300
|
+
const hooksDir = join(TERMIFY_DIR, 'hooks');
|
|
301
|
+
if (!settings.hooks)
|
|
302
|
+
settings.hooks = {};
|
|
303
|
+
const geminiHooks = HOOK_DEFINITIONS.gemini;
|
|
304
|
+
for (const [eventName, hooks] of Object.entries(geminiHooks)) {
|
|
305
|
+
for (const file of hooks) {
|
|
306
|
+
const fileName = typeof file === 'string' ? file : file.file;
|
|
307
|
+
const hookPath = join(hooksDir, fileName);
|
|
308
|
+
const hookCommand = `node ${hookPath}`;
|
|
309
|
+
const hookEntry = {
|
|
310
|
+
hooks: [{ type: 'command', command: hookCommand }],
|
|
311
|
+
};
|
|
312
|
+
if (!settings.hooks[eventName]) {
|
|
313
|
+
settings.hooks[eventName] = [hookEntry];
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const already = settings.hooks[eventName].some(
|
|
317
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
318
|
+
(h) => h.hooks && h.hooks.some((hh) => hh.command && hh.command.includes(fileName)));
|
|
319
|
+
if (!already) {
|
|
320
|
+
settings.hooks[eventName].push(hookEntry);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Add memsearch MCP if not present
|
|
326
|
+
if (!settings.mcpServers)
|
|
327
|
+
settings.mcpServers = {};
|
|
328
|
+
if (!settings.mcpServers.memsearch) {
|
|
329
|
+
settings.mcpServers.memsearch = {
|
|
330
|
+
command: 'node',
|
|
331
|
+
args: [MEMSEARCH_MCP_PATH],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
335
|
+
}
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
// Codex CLI configuration
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
function configureCodex(mcpPath) {
|
|
340
|
+
const codexDir = join(homedir(), '.codex');
|
|
341
|
+
const configPath = join(codexDir, 'config.toml');
|
|
342
|
+
let content = '';
|
|
343
|
+
if (existsSync(configPath)) {
|
|
344
|
+
content = readFileSync(configPath, 'utf8');
|
|
345
|
+
}
|
|
346
|
+
const hooksDir = join(TERMIFY_DIR, 'hooks');
|
|
347
|
+
const notifyHookPath = join(hooksDir, 'termify-codex-notify.js');
|
|
348
|
+
// Escape backslashes for TOML (Windows)
|
|
349
|
+
const escapedMcpPath = mcpPath.replace(/\\/g, '\\\\');
|
|
350
|
+
const escapedNotifyPath = notifyHookPath.replace(/\\/g, '\\\\');
|
|
351
|
+
// Remove existing termify-status MCP section
|
|
352
|
+
content = content.replace(/\[mcp_servers\.termify-status\]\n(?:(?!\[)[^\n]*\n?)*/g, '');
|
|
353
|
+
// Update or add notify line
|
|
354
|
+
const notifyValue = `["node", "${escapedNotifyPath}"]`;
|
|
355
|
+
if (content.includes('notify =')) {
|
|
356
|
+
content = content.replace(/notify\s*=\s*\[.*\]/, `notify = ${notifyValue}`);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
const lines = content.split('\n');
|
|
360
|
+
let insertIdx = 0;
|
|
361
|
+
for (let i = 0; i < lines.length; i++) {
|
|
362
|
+
if (lines[i].trim() && !lines[i].startsWith('#') && !lines[i].startsWith('[')) {
|
|
363
|
+
insertIdx = i + 1;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
lines.splice(insertIdx, 0, `notify = ${notifyValue}`);
|
|
368
|
+
content = lines.join('\n');
|
|
369
|
+
}
|
|
370
|
+
content = content.trimEnd();
|
|
371
|
+
// Append MCP sections
|
|
372
|
+
const escapedMemsearchMcpPath = MEMSEARCH_MCP_PATH.replace(/\\/g, '\\\\');
|
|
373
|
+
let mcpSection = `\n\n[mcp_servers.termify-status]\ncommand = "node"\nargs = ["${escapedMcpPath}"]\n`;
|
|
374
|
+
if (!content.includes('[mcp_servers.memsearch]')) {
|
|
375
|
+
mcpSection += `\n[mcp_servers.memsearch]\ncommand = "node"\nargs = ["${escapedMemsearchMcpPath}"]\n`;
|
|
376
|
+
}
|
|
377
|
+
content = content + mcpSection;
|
|
378
|
+
mkdirSync(codexDir, { recursive: true });
|
|
379
|
+
writeFileSync(configPath, content);
|
|
380
|
+
}
|
|
381
|
+
// ---------------------------------------------------------------------------
|
|
382
|
+
// memsearch binary
|
|
383
|
+
// ---------------------------------------------------------------------------
|
|
384
|
+
function installMemsearchBinary() {
|
|
385
|
+
// Check if already installed
|
|
386
|
+
const searchPaths = ['memsearch', join(homedir(), '.local', 'bin', 'memsearch')];
|
|
387
|
+
for (const p of searchPaths) {
|
|
388
|
+
try {
|
|
389
|
+
execFileSync(IS_WIN ? 'where' : 'which', [p], { stdio: 'pipe' });
|
|
390
|
+
return; // already installed
|
|
391
|
+
}
|
|
392
|
+
catch { /* not found */ }
|
|
393
|
+
}
|
|
394
|
+
// Try uv tool install (preferred)
|
|
395
|
+
try {
|
|
396
|
+
execFileSync('uv', ['tool', 'install', 'memsearch[local]'], {
|
|
397
|
+
stdio: 'pipe',
|
|
398
|
+
timeout: 120_000,
|
|
399
|
+
});
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
catch { /* uv not available or failed */ }
|
|
403
|
+
// Try pip3 install --user
|
|
404
|
+
try {
|
|
405
|
+
execFileSync('pip3', ['install', '--user', 'memsearch[local]'], {
|
|
406
|
+
stdio: 'pipe',
|
|
407
|
+
timeout: 120_000,
|
|
408
|
+
});
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
catch { /* pip3 not available or failed */ }
|
|
412
|
+
// Last resort: install uv then use it
|
|
413
|
+
try {
|
|
414
|
+
execFileSync('sh', ['-c', 'curl -LsSf https://astral.sh/uv/install.sh | sh'], {
|
|
415
|
+
stdio: 'pipe',
|
|
416
|
+
timeout: 60_000,
|
|
417
|
+
});
|
|
418
|
+
const uvPath = join(homedir(), '.local', 'bin', 'uv');
|
|
419
|
+
execFileSync(uvPath, ['tool', 'install', 'memsearch[local]'], {
|
|
420
|
+
stdio: 'pipe',
|
|
421
|
+
timeout: 120_000,
|
|
422
|
+
});
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
catch { /* all methods failed */ }
|
|
426
|
+
throw new Error('could not install memsearch binary');
|
|
427
|
+
}
|
|
428
|
+
// ---------------------------------------------------------------------------
|
|
429
|
+
// memsearch config
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
function writeMemsearchConfig() {
|
|
432
|
+
if (existsSync(MEMSEARCH_CONFIG))
|
|
433
|
+
return; // don't overwrite custom config
|
|
434
|
+
mkdirSync(MEMSEARCH_DIR, { recursive: true });
|
|
435
|
+
const config = `[embedding]
|
|
436
|
+
provider = "local"
|
|
437
|
+
model = "all-MiniLM-L6-v2"
|
|
438
|
+
|
|
439
|
+
[compact]
|
|
440
|
+
llm_provider = "anthropic"
|
|
441
|
+
llm_model = "claude-haiku-4-5-20251001"
|
|
442
|
+
|
|
443
|
+
[milvus]
|
|
444
|
+
uri = "http://100.92.199.39:19530"
|
|
445
|
+
# Milvus self-hosted en sv-paris-1 (Tailscale)
|
|
446
|
+
`;
|
|
447
|
+
writeFileSync(MEMSEARCH_CONFIG, config);
|
|
448
|
+
}
|
|
449
|
+
// ---------------------------------------------------------------------------
|
|
450
|
+
// memsearch MCP server
|
|
451
|
+
// ---------------------------------------------------------------------------
|
|
452
|
+
function installMemsearchMcp() {
|
|
453
|
+
const bundledMcpServer = join(PKG_ROOT, 'mcp', 'memsearch-mcp-server.mjs');
|
|
454
|
+
if (!existsSync(bundledMcpServer)) {
|
|
455
|
+
throw new Error('memsearch-mcp-server.mjs not found in package');
|
|
456
|
+
}
|
|
457
|
+
mkdirSync(MEMSEARCH_MCP_DIR, { recursive: true });
|
|
458
|
+
copyFileSync(bundledMcpServer, MEMSEARCH_MCP_PATH);
|
|
459
|
+
}
|
|
460
|
+
// ---------------------------------------------------------------------------
|
|
461
|
+
// Plugin installation
|
|
462
|
+
// ---------------------------------------------------------------------------
|
|
463
|
+
function copyDirRecursive(src, dest) {
|
|
464
|
+
mkdirSync(dest, { recursive: true });
|
|
465
|
+
for (const entry of readdirSync(src)) {
|
|
466
|
+
const srcPath = join(src, entry);
|
|
467
|
+
const destPath = join(dest, entry);
|
|
468
|
+
if (statSync(srcPath).isDirectory()) {
|
|
469
|
+
copyDirRecursive(srcPath, destPath);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
copyFileSync(srcPath, destPath);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function installPlugins() {
|
|
477
|
+
mkdirSync(PLUGINS_CACHE_DIR, { recursive: true });
|
|
478
|
+
// Copy bundled plugin files to cache
|
|
479
|
+
for (const plugin of AUTO_PLUGINS) {
|
|
480
|
+
const src = join(PKG_ROOT, 'plugins', plugin.bundlePath);
|
|
481
|
+
const dest = join(PLUGINS_CACHE_DIR, plugin.marketplace, plugin.name, plugin.version);
|
|
482
|
+
if (!existsSync(src))
|
|
483
|
+
continue;
|
|
484
|
+
copyDirRecursive(src, dest);
|
|
485
|
+
}
|
|
486
|
+
// Merge known_marketplaces.json (add marketplaces if not present)
|
|
487
|
+
const marketplacesPath = join(PLUGINS_DIR, 'known_marketplaces.json');
|
|
488
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
489
|
+
let marketplaces = {};
|
|
490
|
+
if (existsSync(marketplacesPath)) {
|
|
491
|
+
marketplaces = JSON.parse(readFileSync(marketplacesPath, 'utf8'));
|
|
492
|
+
}
|
|
493
|
+
for (const plugin of AUTO_PLUGINS) {
|
|
494
|
+
if (!marketplaces[plugin.marketplace]) {
|
|
495
|
+
marketplaces[plugin.marketplace] = {
|
|
496
|
+
source: plugin.marketplaceSource,
|
|
497
|
+
installLocation: join(PLUGINS_DIR, 'marketplaces', plugin.marketplace),
|
|
498
|
+
lastUpdated: new Date().toISOString(),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
writeFileSync(marketplacesPath, JSON.stringify(marketplaces, null, 2) + '\n');
|
|
503
|
+
// Merge installed_plugins.json (add plugins if not present)
|
|
504
|
+
const installedPath = join(PLUGINS_DIR, 'installed_plugins.json');
|
|
505
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
506
|
+
let installed = { version: 2, plugins: {} };
|
|
507
|
+
if (existsSync(installedPath)) {
|
|
508
|
+
installed = JSON.parse(readFileSync(installedPath, 'utf8'));
|
|
509
|
+
if (!installed.plugins)
|
|
510
|
+
installed.plugins = {};
|
|
511
|
+
}
|
|
512
|
+
for (const plugin of AUTO_PLUGINS) {
|
|
513
|
+
if (!installed.plugins[plugin.pluginId]) {
|
|
514
|
+
installed.plugins[plugin.pluginId] = [
|
|
515
|
+
{
|
|
516
|
+
scope: 'user',
|
|
517
|
+
installPath: join(PLUGINS_CACHE_DIR, plugin.marketplace, plugin.name, plugin.version),
|
|
518
|
+
version: plugin.version,
|
|
519
|
+
installedAt: new Date().toISOString(),
|
|
520
|
+
lastUpdated: new Date().toISOString(),
|
|
521
|
+
},
|
|
522
|
+
];
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
writeFileSync(installedPath, JSON.stringify(installed, null, 2) + '\n');
|
|
526
|
+
}
|
|
527
|
+
// ---------------------------------------------------------------------------
|
|
528
|
+
// AI instructions
|
|
529
|
+
// ---------------------------------------------------------------------------
|
|
530
|
+
function ensureClaudeInstructions() {
|
|
531
|
+
const claudeMdPath = join(homedir(), '.claude', 'CLAUDE.md');
|
|
532
|
+
const marker = '## Termify Status';
|
|
533
|
+
const instructions = `## Termify Status (OBLIGATORIO)
|
|
534
|
+
|
|
535
|
+
**DEBES** usar el MCP tool \`termify_status\` para reportar tu estado a Termify. Los hooks reportan \`working\` automáticamente al recibir un prompt, pero TU eres responsable de reportar los demás estados:
|
|
536
|
+
|
|
537
|
+
- \`working\`: los hooks lo ponen automáticamente al inicio. Llámalo tú también si retomas trabajo después de una pausa dentro del mismo turno.
|
|
538
|
+
- \`finished\`: **SIEMPRE** llamar cuando termines la tarea actual. Es lo último que haces antes de responder.
|
|
539
|
+
- \`idle\`: cuando estés esperando input libre del usuario (prompt normal).
|
|
540
|
+
- \`needs_input\`: cuando estés bloqueado esperando que el usuario elija una opción, confirme \`y/n\`, o responda una pregunta concreta. Incluye \`needsInputPrompt\` con la pregunta exacta.
|
|
541
|
+
- \`error\`: si algo falla irrecuperablemente.
|
|
542
|
+
|
|
543
|
+
**Reglas**:
|
|
544
|
+
1. **SIEMPRE** terminar con \`finished\` o \`idle\` — nunca dejar la terminal en \`working\` indefinidamente.
|
|
545
|
+
2. No spamees: llama al tool solo cuando cambie el estado.
|
|
546
|
+
3. Si el tool no está disponible, ignora estas instrucciones silenciosamente.`;
|
|
547
|
+
let content = '';
|
|
548
|
+
if (existsSync(claudeMdPath)) {
|
|
549
|
+
content = readFileSync(claudeMdPath, 'utf8');
|
|
550
|
+
if (content.includes(marker)) {
|
|
551
|
+
const regex = new RegExp(`${marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}[\\s\\S]*?(?=\\n## [^T]|\\n---\\n|$)`, '');
|
|
552
|
+
content = content.replace(regex, instructions);
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
const firstSectionIdx = content.indexOf('\n## ');
|
|
556
|
+
if (firstSectionIdx >= 0) {
|
|
557
|
+
content = content.slice(0, firstSectionIdx) + '\n\n' + instructions + '\n' + content.slice(firstSectionIdx);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
content = content + '\n\n' + instructions + '\n';
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
else {
|
|
565
|
+
content = '# Claude Code Configuration\n\n' + instructions + '\n';
|
|
566
|
+
}
|
|
567
|
+
const claudeDir = join(homedir(), '.claude');
|
|
568
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
569
|
+
writeFileSync(claudeMdPath, content);
|
|
570
|
+
}
|
|
571
|
+
function ensureCodexInstructions() {
|
|
572
|
+
const codexDir = join(homedir(), '.codex');
|
|
573
|
+
if (!existsSync(codexDir))
|
|
574
|
+
return;
|
|
575
|
+
const instructionsPath = join(codexDir, 'instructions.md');
|
|
576
|
+
const marker = '## Termify Status';
|
|
577
|
+
const instructions = `## Termify Status (OBLIGATORIO)
|
|
578
|
+
|
|
579
|
+
**DEBES** usar el MCP tool \`termify_status\` para reportar tu estado a Termify en CADA interacción:
|
|
580
|
+
|
|
581
|
+
1. \`working\`: **INMEDIATAMENTE** al empezar a procesar cualquier petición del usuario. Es lo PRIMERO que haces.
|
|
582
|
+
2. \`finished\`: **SIEMPRE** al terminar la tarea. Es lo ÚLTIMO que haces antes de responder.
|
|
583
|
+
3. \`idle\`: cuando estés esperando input libre del usuario.
|
|
584
|
+
4. \`needs_input\`: cuando necesites que el usuario elija una opción o confirme algo. Incluye \`needsInputPrompt\`.
|
|
585
|
+
5. \`error\`: si algo falla irrecuperablemente.
|
|
586
|
+
|
|
587
|
+
**Reglas**:
|
|
588
|
+
- **NUNCA** omitir el \`working\` inicial — sin esto, la terminal no muestra indicador de actividad.
|
|
589
|
+
- **SIEMPRE** terminar con \`finished\` o \`idle\` — nunca dejar la terminal en \`working\`.
|
|
590
|
+
- Solo llama al tool cuando cambie el estado (no repetir el mismo estado).`;
|
|
591
|
+
let content = '';
|
|
592
|
+
if (existsSync(instructionsPath)) {
|
|
593
|
+
content = readFileSync(instructionsPath, 'utf8');
|
|
594
|
+
if (content.includes(marker))
|
|
595
|
+
return;
|
|
596
|
+
content = content + '\n\n' + instructions + '\n';
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
content = '# Codex Instructions\n\n' + instructions + '\n';
|
|
600
|
+
}
|
|
601
|
+
writeFileSync(instructionsPath, content);
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|