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.
Files changed (37) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +2 -0
  3. package/dist/agent.js.map +1 -1
  4. package/dist/auth.d.ts.map +1 -1
  5. package/dist/auth.js +55 -0
  6. package/dist/auth.js.map +1 -1
  7. package/dist/dashboard.d.ts.map +1 -1
  8. package/dist/dashboard.js +26 -2
  9. package/dist/dashboard.js.map +1 -1
  10. package/dist/index.js +5 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/pty-manager.d.ts +19 -0
  13. package/dist/pty-manager.d.ts.map +1 -1
  14. package/dist/pty-manager.js +111 -0
  15. package/dist/pty-manager.js.map +1 -1
  16. package/dist/setup.d.ts +15 -0
  17. package/dist/setup.d.ts.map +1 -0
  18. package/dist/setup.js +603 -0
  19. package/dist/setup.js.map +1 -0
  20. package/hooks/termify-response.js +151 -124
  21. package/hooks/termify-sync.js +165 -116
  22. package/mcp/memsearch-mcp-server.mjs +149 -0
  23. package/package.json +3 -2
  24. package/plugins/context7/.claude-plugin/plugin.json +7 -0
  25. package/plugins/context7/.mcp.json +6 -0
  26. package/plugins/memsearch/.claude-plugin/plugin.json +5 -0
  27. package/plugins/memsearch/README.md +762 -0
  28. package/plugins/memsearch/hooks/common.sh +151 -0
  29. package/plugins/memsearch/hooks/hooks.json +50 -0
  30. package/plugins/memsearch/hooks/parse-transcript.sh +117 -0
  31. package/plugins/memsearch/hooks/session-end.sh +9 -0
  32. package/plugins/memsearch/hooks/session-start.sh +119 -0
  33. package/plugins/memsearch/hooks/stop.sh +117 -0
  34. package/plugins/memsearch/hooks/user-prompt-submit.sh +21 -0
  35. package/plugins/memsearch/scripts/derive-collection.sh +50 -0
  36. package/plugins/memsearch/skills/memory-recall/SKILL.md +42 -0
  37. 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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"}