@jvittechs/jai1-cli 0.1.84 → 0.1.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli.js +1012 -256
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/errors/index.ts","../package.json","../src/services/config.service.ts","../src/services/version-check.service.ts","../src/commands/framework/auth.ts","../src/services/tracking.service.ts","../src/commands/status.ts","../src/services/components.service.ts","../src/commands/apply.ts","../src/ui/apply/UnifiedApplyApp.tsx","../src/ui/shared/ProgressBar.tsx","../src/ui/shared/StatusIcon.tsx","../src/ui/shared/theme.ts","../src/commands/update.ts","../src/commands/framework/check.ts","../src/commands/ide/index.ts","../src/commands/ide/context.ts","../src/ui/context/ContextApp.tsx","../src/ui/context/views/MainMenuView.tsx","../src/ui/context/views/IDEOverviewView.tsx","../src/ui/context/views/ListView.tsx","../src/ui/context/views/DetailView.tsx","../src/services/context-scanner.service.ts","../src/constants/ide-configs.ts","../src/commands/ide/setup.ts","../src/commands/ide/sync.ts","../src/services/migrate-ide.service.ts","../src/constants/ide-migration-configs.ts","../src/commands/learn.ts","../src/ui/guide/GuideApp.tsx","../src/ui/guide/views/MenuView.tsx","../src/ui/guide/views/IntroView.tsx","../src/ui/guide/components/ContentView.tsx","../src/ui/guide/views/RulesView.tsx","../src/ui/guide/views/WorkflowsView.tsx","../src/ui/guide/views/PromptsView.tsx","../src/ui/guide/views/SkillsView.tsx","../src/ui/guide/views/AgenticGuideView.tsx","../src/commands/chat.ts","../src/services/llm-proxy.service.ts","../src/ui/llm/LlmApp.tsx","../src/ui/llm/hooks/useChat.ts","../src/ui/llm/hooks/useLlmApi.ts","../src/ui/llm/components/ChatPanel.tsx","../src/ui/llm/components/MessageItem.tsx","../src/ui/llm/components/InputBox.tsx","../src/ui/llm/components/ModelSelector.tsx","../src/commands/openai-keys.ts","../src/commands/stats.ts","../src/commands/translate.ts","../src/services/translation.service.ts","../src/commands/utils/index.ts","../src/commands/utils/password.ts","../src/services/utils.service.ts","../src/commands/utils/uuid.ts","../src/commands/utils/hash.ts","../src/commands/utils/base64-encode.ts","../src/commands/utils/base64-decode.ts","../src/commands/utils/http.ts","../src/commands/utils/jwt.ts","../src/commands/utils/unix-time.ts","../src/commands/utils/timezone.ts","../src/commands/utils/url-encode.ts","../src/commands/utils/url-decode.ts","../src/commands/utils/cron.ts","../src/commands/utils/markdown-preview.ts","../src/commands/utils/interactive.ts","../src/ui/utils/UtilsApp.tsx","../src/ui/utils/views/PasswordView.tsx","../src/ui/utils/views/UuidView.tsx","../src/ui/utils/views/HashView.tsx","../src/ui/utils/views/Base64View.tsx","../src/ui/utils/views/UrlView.tsx","../src/ui/utils/views/UnixTimeView.tsx","../src/ui/utils/views/JwtView.tsx","../src/ui/utils/views/CronView.tsx","../src/ui/utils/views/TimezoneView.tsx","../src/ui/utils/views/HttpView.tsx","../src/ui/utils/views/MarkdownView.tsx","../src/commands/kit/index.ts","../src/commands/kit/list.ts","../src/services/starter-kit.service.ts","../src/commands/kit/info.ts","../src/commands/kit/create.ts","../src/services/hook-executor.service.ts","../src/commands/upgrade.ts","../src/commands/clean.ts","../src/commands/redmine/check.ts","../src/services/redmine-config.service.ts","../src/types/redmine.types.ts","../src/api.ts","../src/services/redmine-connectivity.service.ts","../src/commands/redmine/sync-issue.ts","../src/sync-issue.ts","../src/mappers.ts","../src/slug.util.ts","../src/file.util.ts","../src/commands/redmine/sync-project.ts","../src/sync-project.ts","../src/commands/framework/info.ts","../src/commands/self-update.ts","../src/commands/clear-backups.ts","../src/commands/vscode/index.ts","../src/commands/guide.ts","../src/commands/context.ts","../src/commands/migrate-ide.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { Jai1Error } from './errors/index.js';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { checkForClientUpdate } from './services/version-check.service.js';\n\n// ============================================\n// SETUP & AUTH COMMANDS\n// ============================================\nimport { createAuthCommand } from './commands/framework/auth.js';\nimport { createStatusCommand } from './commands/status.js';\n\n// ============================================\n// COMPONENT MANAGEMENT COMMANDS\n// ============================================\nimport { createApplyCommand } from './commands/apply.js';\nimport { createUpdateCommand } from './commands/update.js';\nimport { createCheckCommand } from './commands/framework/check.js';\n\n// ============================================\n// IDE COMMANDS (grouped)\n// ============================================\nimport { createIdeCommand } from './commands/ide/index.js';\n\n// ============================================\n// LEARNING COMMAND\n// ============================================\nimport { createLearnCommand } from './commands/learn.js';\n\n// ============================================\n// LLM PROXY COMMAND\n// ============================================\nimport { createChatCommand } from './commands/chat.js';\nimport { createOpenAiKeysCommand } from './commands/openai-keys.js';\nimport { createStatsCommand } from './commands/stats.js';\nimport { createTranslateCommand } from './commands/translate.js';\n\n// ============================================\n// DEVELOPER UTILITIES\n// ============================================\nimport { createUtilsCommand } from './commands/utils/index.js';\n\n// ============================================\n// STARTER KITS\n// ============================================\nimport { createKitCommand } from './commands/kit/index.js';\n\n// ============================================\n// MAINTENANCE COMMANDS\n// ============================================\nimport { createUpgradeCommand } from './commands/upgrade.js';\nimport { createCleanCommand } from './commands/clean.js';\n\n// ============================================\n// EXTERNAL INTEGRATIONS\n// ============================================\nimport { createRedmineCheckCommand } from './commands/redmine/check.js';\nimport { createSyncIssueCommand } from './commands/redmine/sync-issue.js';\nimport { createSyncProjectCommand } from './commands/redmine/sync-project.js';\n\n// ============================================\n// LEGACY ALIASES (for backward compatibility)\n// ============================================\nimport { createInfoCommand } from './commands/framework/info.js';\nimport { createSelfUpdateCommand } from './commands/self-update.js';\nimport { createClearBackupsCommand } from './commands/clear-backups.js';\nimport { createVSCodeCommand } from './commands/vscode/index.js';\nimport { createGuideCommand } from './commands/guide.js';\nimport { createContextCommand } from './commands/context.js';\nimport { createMigrateIdeCommand } from './commands/migrate-ide.js';\n\nconst program = new Command();\n\n// Manual version check to support update checking\nif (process.argv.includes('-v') || process.argv.includes('--version')) {\n console.log(packageJson.version);\n // Check for updates\n if (!process.argv.includes('--skip-update-check')) {\n await checkForClientUpdate();\n }\n process.exit(0);\n}\n\nprogram\n .name('jai1')\n .description('Jai1 Framework Management CLI')\n// .version() removed to custom handle update check (handled above)\n\n// Global options\nprogram\n // .option('-v, --version', 'output the version number') // Handled manually\n .option('--verbose', 'Enable verbose logging')\n .option('--json', 'Output results as JSON')\n .option('--skip-update-check', 'Skip checking for client updates');\n\n// ============================================\n// 🔧 SETUP & INFO\n// ============================================\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createStatusCommand());\n\n// ============================================\n// 📦 COMPONENT MANAGEMENT\n// ============================================\nprogram.addCommand(createApplyCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createCheckCommand());\n\n// ============================================\n// 🖥️ IDE INTEGRATION (grouped)\n// ============================================\nprogram.addCommand(createIdeCommand());\n\n// ============================================\n// 📚 LEARNING\n// ============================================\nprogram.addCommand(createLearnCommand());\n\n// ============================================\n// 🤖 LLM PROXY\n// ============================================\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createOpenAiKeysCommand());\nprogram.addCommand(createStatsCommand());\nprogram.addCommand(createTranslateCommand());\n\n// ============================================\n// 🛠️ DEVELOPER UTILITIES\n// ============================================\nprogram.addCommand(createUtilsCommand());\n\n// ============================================\n// 📦 STARTER KITS\n// ============================================\nprogram.addCommand(createKitCommand());\n\n// ============================================\n// 🔧 MAINTENANCE\n// ============================================\nprogram.addCommand(createUpgradeCommand());\nprogram.addCommand(createCleanCommand());\n\n// ============================================\n// 🔗 EXTERNAL INTEGRATIONS\n// ============================================\nconst redmineCommand = new Command('redmine')\n .description('Redmine context sync commands');\n\nredmineCommand.addCommand(createRedmineCheckCommand());\n\nconst syncCommand = new Command('sync')\n .description('Sync Redmine issues to markdown files');\n\nsyncCommand.addCommand(createSyncIssueCommand());\nsyncCommand.addCommand(createSyncProjectCommand());\n\nredmineCommand.addCommand(syncCommand);\n\nprogram.addCommand(redmineCommand);\n\n// ============================================\n// 🔄 LEGACY ALIASES (backward compatibility)\n// Hidden from help, but still work\n// ============================================\n\n\n// Legacy: info -> status\nprogram.addCommand(createInfoCommand(), { hidden: true });\n\n// Legacy: self-update -> upgrade \nprogram.addCommand(createSelfUpdateCommand(), { hidden: true });\n\n// Legacy: clear-backups -> clean\nprogram.addCommand(createClearBackupsCommand(), { hidden: true });\n\n// Legacy: vscode -> ide setup\nprogram.addCommand(createVSCodeCommand(), { hidden: true });\n\n// Legacy: guide -> learn\nprogram.addCommand(createGuideCommand(), { hidden: true });\n\n// Legacy: context -> ide context\nprogram.addCommand(createContextCommand(), { hidden: true });\n\n// Legacy: migrate-ide -> ide sync\nprogram.addCommand(createMigrateIdeCommand(), { hidden: true });\n\n\n// Handle unknown commands\nprogram.on('command:*', (operands) => {\n console.error(`❌ Unknown command: ${operands[0]}`);\n console.error('\\nAvailable commands:');\n console.error('');\n console.error(' 🔧 Setup & Info');\n console.error(' auth Authenticate and configure jai1-client');\n console.error(' status Show configuration and installed components');\n console.error('');\n console.error(' 📦 Components');\n console.error(' apply Install/apply components (interactive UI)');\n console.error(' update Update installed components');\n console.error(' check Check for component updates');\n console.error('');\n console.error(' 🖥️ IDE');\n console.error(' ide context Browse and explore IDE context');\n console.error(' ide setup Configure IDE settings');\n console.error(' ide sync Sync .jai1 content to IDEs');\n console.error('');\n console.error(' 📚 Learning');\n console.error(' learn Interactive Agentic Coding guide');\n console.error('');\n console.error(' 🤖 LLM Proxy');\n console.error(' chat Interactive AI chat');\n console.error(' openai-keys Show OpenAI-compatible API credentials');\n console.error(' stats Show LLM usage statistics and limits');\n console.error(' translate Translate text, files, or folders using AI');\n console.error('');\n console.error(' 🛠️ Developer Utilities');\n console.error(' utils Developer tools (password, uuid, hash, jwt, etc.)');\n console.error('');\n console.error(' 🔧 Maintenance');\n console.error(' upgrade Upgrade jai1-client to latest version');\n console.error(' clean Clean up backups and cache');\n console.error('');\n console.error(' 🔗 Integrations');\n console.error(' redmine Redmine integration commands');\n console.error('');\n console.error('Use \"jai1 --help\" for more information.');\n process.exit(1);\n});\n\n// Error handling\nprocess.on('unhandledRejection', (error) => {\n if (error instanceof Jai1Error) {\n console.error('❌', error.message);\n process.exit(error.exitCode);\n } else if (error instanceof Error) {\n console.error('❌ Unexpected error:', error.message);\n if (program.opts().verbose) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).then(async () => {\n const opts = program.opts();\n\n // Check for client updates after command execution (unless skipped)\n if (!opts.skipUpdateCheck) {\n await checkForClientUpdate();\n }\n}).catch((error) => {\n console.error('❌', error.message);\n process.exit(1);\n});\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n","{\n \"name\": \"@jvittechs/jai1-cli\",\n \"version\": \"0.1.84\",\n \"description\": \"A unified CLI tool for JV-IT TECHS developers to manage Jai1 Framework. Please contact TeamAI for usage instructions.\",\n \"type\": \"module\",\n \"bin\": {\n \"jai1\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"redmine.config.example.yaml\",\n \"scripts/redmine-sync-issue.sh\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"license\": \"MIT\",\n \"author\": \"JVIT <dev@jvit.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jvittechs/jai.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/jvittechs/jai/tree/main/packages/cli#readme\",\n \"keywords\": [\n \"jai1\",\n \"framework\",\n \"redmine\",\n \"cli\",\n \"markdown\",\n \"issues\",\n \"context\",\n \"agentic\",\n \"coding\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/cli.ts --dts --format esm --target node22 --out-dir dist --sourcemap\",\n \"dev\": \"tsx src/cli.ts --help\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"release\": \"node scripts/release.js\",\n \"smart-publish\": \"node scripts/smart-publish.js\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.0.2\",\n \"adm-zip\": \"^0.5.16\",\n \"bcryptjs\": \"^2.4.3\",\n \"cli-progress\": \"^3.12.0\",\n \"clipboardy\": \"^4.0.0\",\n \"commander\": \"^12.1.0\",\n \"cronstrue\": \"^2.50.0\",\n \"execa\": \"^9.6.1\",\n \"gray-matter\": \"^4.0.3\",\n \"ink\": \"^5.0.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"marked\": \"^12.0.0\",\n \"marked-terminal\": \"^7.0.0\",\n \"p-limit\": \"^5.0.0\",\n \"p-queue\": \"^7.4.1\",\n \"p-retry\": \"^6.2.0\",\n \"react\": \"^18.3.1\",\n \"slugify\": \"^1.6.6\",\n \"undici\": \"^6.19.5\",\n \"yaml\": \"^2.5.0\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.7\",\n \"@types/node\": \"^24.10.1\",\n \"@types/react\": \"^18.3.12\",\n \"@typescript-eslint/eslint-plugin\": \"^8.6.0\",\n \"@typescript-eslint/parser\": \"^8.6.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.9.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.6.3\",\n \"vitest\": \"^2.1.4\"\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { Jai1Config } from '../types/framework.types.js';\n\n/**\n * Service for managing Jai1 global configuration\n * Config stored in ~/.jai1/config.json\n */\nexport class ConfigService {\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor() {\n this.configDir = join(homedir(), '.jai1');\n this.configPath = join(this.configDir, 'config.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load configuration from file\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1Config | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1Config;\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save configuration to file\n * Creates directory if it doesn't exist\n * Sets proper file permissions (600)\n */\n async save(config: Jai1Config): Promise<void> {\n try {\n // Ensure directory exists with restricted permissions\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });\n\n // Write config with restricted permissions\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\n } catch (error) {\n throw new Error(\n `Failed to save config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n}\n","import { ConfigService } from './config.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n// Cache to avoid checking too frequently\nlet lastCheckTime = 0;\nlet cachedLatestVersion: string | null = null;\nlet shouldCheckUpdates = true;\nconst CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Disable automatic update checks for this session\n */\nexport function disableUpdateCheck() {\n shouldCheckUpdates = false;\n}\n\n/**\n * Check if there's a newer version of jai1-client available\n * This runs silently and only shows a message if update is available\n */\nexport async function checkForClientUpdate(): Promise<void> {\n if (!shouldCheckUpdates) return;\n\n try {\n // Check only once per hour\n const now = Date.now();\n if (now - lastCheckTime < CHECK_INTERVAL_MS && cachedLatestVersion) {\n if (isNewerVersion(cachedLatestVersion, packageJson.version)) {\n showUpdateNotification(cachedLatestVersion);\n }\n return;\n }\n\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n return; // Not initialized, skip check\n }\n\n // Fetch latest client version from API\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return; // Silently fail\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n lastCheckTime = now;\n cachedLatestVersion = data.version;\n\n if (isNewerVersion(data.version, packageJson.version)) {\n showUpdateNotification(data.version);\n }\n } catch {\n // Silently fail - don't interrupt user flow\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Show update notification to user\n */\nfunction showUpdateNotification(latestVersion: string): void {\n console.log('');\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${packageJson.version} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} Run: ${colors.cyan}jai1 upgrade${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}`);\n console.log('');\n}\n\n/**\n * Get current client version\n */\nexport function getClientVersion(): string {\n return packageJson.version;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { trackActionSync } from '../../services/tracking.service.js';\nimport { ValidationError, AuthenticationError } from '../../errors/index.js';\nimport type { InitOptions } from '../../types/framework.types.js';\n\n/**\n * Create auth command for Jai1 Framework\n * Allows both interactive and non-interactive modes\n */\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth')\n .description('Authenticate and configure jai1-client')\n .option('--api-url <url>', 'Jai1 Store API URL')\n .option('--access-key <key>', 'Your access key')\n .action(async (options: InitOptions) => {\n await handleAuth(options);\n });\n\n return cmd;\n}\n\nasync function handleAuth(options: InitOptions): Promise<void> {\n const configService = new ConfigService();\n\n let apiUrl: string;\n let accessKey: string;\n let isInteractive = false;\n\n // Check if config already exists\n const existingConfig = await configService.load();\n if (existingConfig) {\n console.log('⚠️ Configuration already exists at:', configService.getConfigPath());\n console.log(' Run this command again with new values to overwrite.');\n console.log('');\n }\n\n // Interactive vs Non-Interactive mode\n if (options.apiUrl && options.accessKey) {\n // Non-interactive mode\n apiUrl = options.apiUrl;\n accessKey = options.accessKey;\n } else if (options.apiUrl || options.accessKey) {\n // Partial options provided - error\n throw new ValidationError(\n 'Both --api-url and --access-key are required in non-interactive mode'\n );\n } else {\n // Interactive mode\n isInteractive = true;\n console.log('🚀 Jai1 Client Setup');\n console.log('─────────────────\\n');\n\n // For now, use simple readline until inquirer is installed\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n\n apiUrl = await question('API URL (https://store.jai1.io): ');\n if (!apiUrl) {\n apiUrl = 'https://store.jai1.io';\n }\n\n accessKey = await question('Access Key: ');\n if (!accessKey) {\n rl.close();\n throw new ValidationError('Access key is required');\n }\n\n rl.close();\n }\n\n // Validate API URL format\n try {\n new URL(apiUrl);\n } catch {\n throw new ValidationError('Invalid API URL format');\n }\n\n console.log('\\nValidating access key...');\n\n // TODO: Validate access key with API\n // For now, just save it\n // const isValid = await validateAccessKey(apiUrl, accessKey);\n // if (!isValid) {\n // throw new AuthenticationError('Invalid access key');\n // }\n\n // Save config\n await configService.save({\n apiUrl,\n accessKey,\n version: null,\n lastUpdated: null,\n });\n\n // Track auth action (sync to ensure it completes before exit)\n await trackActionSync('auth', {\n configPath: configService.getConfigPath(),\n mode: isInteractive ? 'interactive' : 'non-interactive',\n isReconfig: !!existingConfig,\n });\n\n console.log('✓ Configuration saved to', configService.getConfigPath());\n console.log('');\n console.log(\"You're all set! Run 'jai1 check' to check for updates.\");\n}\n","import { ConfigService } from './config.service.js';\nimport { platform, release, arch, hostname, homedir } from 'os';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tracking action categories\n */\nexport type TrackingAction =\n | 'init'\n | 'download'\n | 'version_check'\n | 'sync'\n | 'update'\n | 'redmine_check'\n | 'redmine_sync_issue'\n | 'redmine_sync_project'\n | 'vscode'\n | 'info'\n | 'check';\n\nexport interface TrackingDetail {\n [key: string]: unknown;\n}\n\n/**\n * Get basic system info for logging\n */\nfunction getSystemInfo(): Record<string, string> {\n return {\n os: platform(),\n osRelease: release(),\n arch: arch(),\n nodeVersion: nodeVersion,\n hostname: hostname(),\n homeDir: homedir(),\n };\n}\n\n/**\n * Service for tracking CLI usage to server\n * Tracking is fire-and-forget, errors are silently ignored\n */\nexport class TrackingService {\n private configService: ConfigService;\n\n constructor() {\n this.configService = new ConfigService();\n }\n\n /**\n * Track a CLI action (fire-and-forget)\n * WARNING: Process may exit before request completes\n * Use trackSync for important events\n *\n * @param action - The action being performed\n * @param detail - Optional additional details\n */\n async track(action: TrackingAction, detail?: TrackingDetail): Promise<void> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n\n // Fire and forget - don't await\n this.sendTrackingEvent(trackUrl, config.accessKey, action, detail).catch(\n () => {\n // Silently ignore tracking errors\n }\n );\n } catch {\n // Silently ignore config errors\n }\n }\n\n /**\n * Track a CLI action synchronously (waits for completion)\n * Use this for important events before process exit\n */\n async trackSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return false;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n return await this.sendTrackingEvent(trackUrl, config.accessKey, action, detail);\n } catch {\n return false;\n }\n }\n\n private async sendTrackingEvent(\n trackUrl: string,\n accessKey: string,\n action: TrackingAction,\n detail?: TrackingDetail\n ): Promise<boolean> {\n try {\n // Merge detail with system info\n const enrichedDetail = {\n ...getSystemInfo(),\n ...detail,\n };\n\n const response = await fetch(trackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n action,\n detail: enrichedDetail,\n clientVersion: packageJson.version,\n }),\n // Timeout to avoid blocking too long\n signal: AbortSignal.timeout(10000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance for convenience\nlet trackingInstance: TrackingService | null = null;\n\n/**\n * Get or create tracking service instance\n */\nexport function getTrackingService(): TrackingService {\n if (!trackingInstance) {\n trackingInstance = new TrackingService();\n }\n return trackingInstance;\n}\n\n/**\n * Convenience function to track an action (fire-and-forget)\n * WARNING: May not complete before process exit\n */\nexport function trackAction(action: TrackingAction, detail?: TrackingDetail): void {\n getTrackingService().track(action, detail);\n}\n\n/**\n * Convenience function to track an action synchronously\n * Use this for important events at end of commands\n */\nexport async function trackActionSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n return getTrackingService().trackSync(action, detail);\n}\n","/**\n * Status Command\n * Show jai1-client configuration and installed components status\n * \n * Renamed from 'info' to 'status' for clarity (common CLI pattern)\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../types/framework.types.js';\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show configuration and installed components status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleStatus(options);\n });\n\n return cmd;\n}\n\nasync function handleStatus(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n const installedComponents = await componentsService.getInstalled();\n const componentCount = Object.keys(installedComponents).length;\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n componentCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('📊 Jai1 Client Status');\n console.log('─────────────────────\\n');\n\n // Configuration section\n console.log('🔧 Configuration');\n console.log(` Config: ${info.configPath}`);\n console.log(` API URL: ${info.apiUrl}`);\n console.log(` Access Key: ${info.accessKey}`);\n console.log();\n\n // Framework section\n console.log('📦 Framework');\n console.log(` Version: ${info.version}`);\n console.log(` Updated: ${info.lastUpdated}`);\n console.log(` Location: ${info.frameworkPath}`);\n console.log();\n\n // Project section\n console.log('📁 Project');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Components: ${componentCount} installed`);\n }\n console.log();\n\n // Quick tips\n if (!info.projectStatus.exists) {\n console.log('💡 Run \"jai1 apply\" to install components for this project.');\n } else if (componentCount > 0) {\n console.log('💡 Run \"jai1 check\" to check for component updates.');\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n\n await fs.mkdir(targetFolder, { recursive: true });\n\n let checksumContent = component.content; // Default for simple types\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n // For bundle it was set above\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { UnifiedApplyApp } from '../ui/apply/UnifiedApplyApp.js';\n\n/**\n * Create apply command with Unified Ink UI\n */\nexport function createApplyCommand(): Command {\n const cmd = new Command('apply')\n .description('Apply components to your project (interactive UI)')\n .argument('[items...]', 'Package name or component filepaths (non-interactive mode)')\n .option('--force', 'Force overwrite even if modified locally')\n .option('--no-interactive', 'Disable interactive UI (for CI/CD)')\n .action(async (items: string[], options: { force?: boolean; interactive?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Non-interactive mode or direct arguments\n if (options.interactive === false || items.length > 0) {\n await nonInteractiveApply(config, items, options);\n return;\n }\n\n // Interactive mode with Unified Ink UI\n const { waitUntilExit } = render(\n React.createElement(UnifiedApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Non-interactive apply (for CLI args or CI/CD)\n */\nasync function nonInteractiveApply(\n config: any,\n items: string[],\n options: { force?: boolean }\n) {\n const componentsService = new ComponentsService();\n\n if (items.length === 0) {\n console.log('❌ No items specified. Use interactive mode or provide package/component names.');\n console.log('💡 Usage: jai1 apply <package> or jai1 apply <filepath...>');\n return;\n }\n\n // Check if first arg is a package\n const tags = await componentsService.listTags(config);\n const packageNames = tags.map(t => t.tag);\n\n let filepaths: string[];\n\n if (items.length === 1 && packageNames.includes(items[0]!)) {\n // Package mode\n console.log(`📦 Applying package '${items[0]}'...`);\n const components = await componentsService.list(config, { tag: items[0] });\n filepaths = components.map(c => c.filepath);\n } else {\n // Direct filepaths\n filepaths = items;\n }\n\n // Resolve dependencies\n console.log('🔍 Resolving dependencies...');\n const resolvedPaths = await componentsService.resolveWithDependencies(config, filepaths);\n\n console.log(`📦 Will apply ${resolvedPaths.length} component(s):`);\n for (const fp of resolvedPaths) {\n const isDep = !filepaths.includes(fp);\n const suffix = isDep ? ' (dependency)' : '';\n console.log(` - ${fp}${suffix}`);\n }\n\n // Install\n const targetDir = process.cwd() + '/.jai1';\n const installed = await componentsService.getInstalled();\n let added = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const fp of resolvedPaths) {\n try {\n const info = installed[fp];\n\n if (info && !options.force && info.modified) {\n console.log(`⚠️ ${fp}: modified locally. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n\n console.log(`📥 Downloading ${fp}...`);\n await componentsService.install(config, fp, targetDir);\n\n if (info) updated++;\n else added++;\n\n console.log(`✅ ${fp}`);\n } catch (error) {\n console.log(`❌ ${fp}: ${error instanceof Error ? error.message : 'Error'}`);\n }\n }\n\n console.log(`\\n✅ Complete: ${added} added, ${updated} updated, ${skipped} skipped`);\n console.log(`📁 Location: ${targetDir}`);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary';\n\ninterface UnifiedApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Unified Apply App - All-in-one interface\n */\nexport const UnifiedApplyApp: React.FC<UnifiedApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n const [focusArea, setFocusArea] = useState<'search' | 'packages' | 'components'>('components');\n const [selectedPackageIndex, setSelectedPackageIndex] = useState(0);\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n const service = new ComponentsService();\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled(),\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data');\n } finally {\n setLoading(false);\n }\n };\n loadData();\n }, []);\n\n // Filter components based on search\n const filteredComponents = useMemo(() => {\n if (!searchQuery.trim()) return components;\n const query = searchQuery.toLowerCase();\n return components.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.name.toLowerCase().includes(query) ||\n (c.tags && c.tags.some(t => t.toLowerCase().includes(query)))\n );\n }, [components, searchQuery]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Summary view - exit on Enter or q\n if (viewState === 'summary') {\n if (key.return || input === 'q' || key.escape) {\n onExit();\n }\n return;\n }\n\n // Installing view - no input\n if (viewState === 'installing') {\n return;\n }\n\n // Browse view\n // Tab to switch focus areas\n if (key.tab) {\n if (focusArea === 'search') setFocusArea('packages');\n else if (focusArea === 'packages') setFocusArea('components');\n else setFocusArea('search');\n return;\n }\n\n // Escape to exit\n if (key.escape || input === 'q') {\n onExit();\n return;\n }\n\n // Enter to apply\n if (key.return && focusArea !== 'search') {\n if (selectedPaths.size > 0) {\n handleApply();\n }\n return;\n }\n\n // Navigation in components\n if (focusArea === 'components') {\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle selection\n const current = filteredComponents[cursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) {\n next.delete(current.filepath);\n } else {\n next.add(current.filepath);\n }\n return next;\n });\n }\n } else if (input === 'a') {\n // Select all filtered\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n } else if (input === 'c') {\n // Clear selection\n setSelectedPaths(new Set());\n }\n }\n\n // Navigation in packages\n if (focusArea === 'packages') {\n if (key.leftArrow) {\n setSelectedPackageIndex(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedPackageIndex(prev => Math.min(tags.length - 1, prev + 1));\n } else if (input === ' ' || key.return) {\n // Quick select package\n const tag = tags[selectedPackageIndex];\n if (tag) {\n const packageComponents = components.filter(c => c.tags?.includes(tag.tag));\n setSelectedPaths(prev => {\n const next = new Set(prev);\n packageComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n // Also filter to this package\n setSearchQuery(tag.tag);\n }\n }\n }\n });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n // Resolve dependencies\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n // Initialize progress\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const,\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n\n // Update to downloading\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: 'Modified locally' } : p\n ));\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: err instanceof Error ? err.message : 'Error' } : p\n ));\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n setViewState('summary');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> Đang tải components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">❌ Error: {error}</Text>\n <Text dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Installing Components</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n 📊 <Text color=\"green\">{installStats.added} added</Text>\n {' · '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' · '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">✅ Installation Complete!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> └─ <Text color=\"green\">{installStats.added}</Text> newly added</Text>\n <Text> └─ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> └─ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n\n <Box marginTop={1}>\n <Text>📁 Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter or q to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse (main view)\n const visibleComponents = filteredComponents.slice(0, 12);\n const hasMore = filteredComponents.length > 12;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Jai1 Apply</Text>\n <Text dimColor> - Select components to install</Text>\n </Box>\n\n {/* Search Box */}\n <Box marginBottom={1}>\n <Text color={focusArea === 'search' ? 'cyan' : 'gray'}>🔍 Search: </Text>\n {focusArea === 'search' ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>Press Tab to search</Text>}</Text>\n )}\n </Box>\n\n {/* Quick Packages */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold dimColor>Quick Apply (Packages):</Text>\n <Box marginTop={1} flexWrap=\"wrap\">\n {tags.slice(0, 6).map((tag, i) => {\n const isSelected = focusArea === 'packages' && i === selectedPackageIndex;\n return (\n <Box key={tag.tag} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n [{tag.tag}:{tag.count}]\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Components List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={focusArea === 'components' ? 'cyan' : 'gray'} padding={1}>\n <Box marginBottom={1}>\n <Text bold>Components </Text>\n <Text dimColor>({filteredComponents.length} shown{hasMore ? `, scroll for more` : ''})</Text>\n </Box>\n\n {visibleComponents.map((comp, i) => {\n const isCursor = i === cursorIndex && focusArea === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? '❯ ' : ' '}\n {isChecked ? '[✓]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? '✓ installed' : '○ new'}</Text>\n </Box>\n );\n })}\n\n {filteredComponents.length === 0 && (\n <Text dimColor>No components match your search</Text>\n )}\n </Box>\n\n {/* Selected Preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Selected: {selectedPaths.size} components</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {Array.from(selectedPaths).slice(0, 4).map(fp => (\n <Text key={fp} dimColor>📌 {fp}</Text>\n ))}\n {selectedPaths.size > 4 && (\n <Text dimColor> ... and {selectedPaths.size - 4} more</Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Switch area · [↑↓] Navigate · [␣] Toggle · [a] Select all · [c] Clear · [Enter] Apply · [q] Quit\n </Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ProgressBarProps {\n current: number;\n total: number;\n width?: number;\n showPercentage?: boolean;\n color?: string;\n}\n\n/**\n * ASCII progress bar component\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n current,\n total,\n width = 40,\n showPercentage = true,\n color = 'cyan',\n}) => {\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return (\n <Box>\n <Text color={color}>{bar}</Text>\n {showPercentage && (\n <Text dimColor> {current}/{total} ({percentage}%)</Text>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Text } from 'ink';\nimport { theme } from './theme.js';\n\nexport type Status = 'success' | 'error' | 'pending' | 'loading' | 'warning';\n\ninterface StatusIconProps {\n status: Status;\n text?: string;\n}\n\n/**\n * Status icon component with optional text\n */\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status, text }) => {\n const iconMap: Record<Status, string> = {\n success: theme.icons.success,\n error: theme.icons.error,\n pending: theme.icons.pending,\n loading: theme.icons.loading,\n warning: theme.icons.warning,\n };\n\n const colorMap: Record<Status, string> = {\n success: 'green',\n error: 'red',\n pending: 'gray',\n loading: 'yellow',\n warning: 'yellow',\n };\n\n const icon = iconMap[status];\n const color = colorMap[status];\n\n return (\n <Text color={color}>\n {icon} {text}\n </Text>\n );\n};\n","/**\n * Theme configuration for Ink UI components\n */\n\nexport const theme = {\n colors: {\n primary: '#6366f1', // Indigo\n success: '#22c55e', // Green\n warning: '#eab308', // Yellow\n error: '#ef4444', // Red\n muted: '#6b7280', // Gray\n border: '#374151', // Dark gray\n text: '#f3f4f6', // Light gray\n background: '#1a1a2e', // Dark background\n },\n\n icons: {\n success: '✅',\n error: '❌',\n pending: '○',\n loading: '⏳',\n package: '📦',\n folder: '📁',\n file: '📄',\n tip: '💡',\n warning: '⚠️',\n checkmark: '✓',\n arrow: '→',\n bullet: '•',\n },\n\n borders: {\n single: {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n },\n double: {\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n horizontal: '═',\n vertical: '║',\n },\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n return new Command('update')\n .description('Update installed components to latest versions')\n .option('--force', 'Force update even if files are modified locally')\n .action(async (options: { force?: boolean }) => {\n await handleUpdate(options);\n });\n}\n\nasync function handleUpdate(options: { force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to add components.');\n return;\n }\n\n console.log('🔍 Checking for updates...');\n\n // Get checksums from API\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n console.log(`⚠️ ${fp}: Component not found on server (deprecated?)`);\n continue;\n }\n\n // Check if update needed based on checksum or version\n // Using checksum is more reliable for content changes\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n if (updates.length === 0) {\n console.log('✅ All components are up to date.');\n return;\n }\n\n console.log(`\\n📦 Found ${updates.length} updates:`);\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` - ${fp} (v${current.version} → v${latest.version})`);\n }\n console.log();\n\n if (!options.force) {\n const shouldUpdate = await confirm({ message: 'Update now?', default: true });\n if (!shouldUpdate) return;\n }\n\n // Perform updates\n const targetDir = process.cwd() + '/.jai1';\n let updatedCount = 0;\n const backupPaths: string[] = [];\n\n for (const fp of updates) {\n try {\n // Backup\n console.log(`📥 Updating ${fp}...`);\n const backupPath = await componentsService.backupFile(fp, targetDir);\n if (backupPath) {\n backupPaths.push(backupPath);\n // Simplify backup path for display\n const displayPath = backupPath.split('.jai1_backup/')[1];\n console.log(` Backed up: .../${displayPath}`);\n }\n\n // Install\n await componentsService.install(config, fp, targetDir);\n console.log(`✅ Updated`);\n updatedCount++;\n } catch (error) {\n console.log(`❌ Failed to update ${fp}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n console.log(`\\n✅ Update complete: ${updatedCount}/${updates.length} updated.`);\n\n if (backupPaths.length > 0) {\n console.log(`\\n📁 Backups created in .jai1_backup/`);\n\n // Default No for cleanup safety\n const cleanBackups = await confirm({ message: 'Clear these backups?', default: false });\n if (cleanBackups) {\n await componentsService.clearBackups(process.cwd());\n console.log('🗑️ Backups cleared.');\n } else {\n console.log('💡 Run \"jai1 clean\" to remove them later.');\n }\n }\n\n trackAction('components_update', { count: updatedCount });\n\n } catch (error) {\n throw new Error(`Update check failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { trackAction } from '../../services/tracking.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { compareVersions, formatVersion } from '../../utils/version.js';\n\ninterface CheckOptions {\n json?: boolean;\n}\n\n/**\n * Create check command for Jai1 Framework\n * Checks current version and compares with latest from server\n */\nexport function createCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check for framework updates')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleCheck(options: CheckOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to get started.');\n return;\n }\n\n console.log('Checking for updates...\\n');\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n // Component removed from server?\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Output status\n console.log(`📌 Components status:`);\n\n // Show updates first\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` ${fp} v${current.version} → v${latest.version} ⚠️ UPDATE`);\n }\n\n // Show up-to-date (limit showing all if too many?)\n // Let's show all for now, or just summary\n if (updates.length === 0 && upToDate.length > 0) {\n console.log(` ✓ All ${upToDate.length} components up to date.`);\n } else if (upToDate.length > 0) {\n console.log(` ✓ ${upToDate.length} components up to date.`);\n }\n\n console.log();\n if (updates.length > 0) {\n console.log(`Status: ${updates.length} component(s) update available!`);\n console.log(`Run 'jai1 update' to update.`);\n } else {\n console.log(`Status: ✅ All good!`);\n }\n\n } catch (error) {\n console.error('Error checking updates:', error instanceof Error ? error.message : error);\n }\n}\n\n","/**\n * IDE Command Group\n * Manages IDE integration commands: context, setup, sync\n */\nimport { Command } from 'commander';\nimport { createContextSubcommand } from './context.js';\nimport { createSetupSubcommand } from './setup.js';\nimport { createSyncSubcommand } from './sync.js';\n\n/**\n * Create IDE command group\n * Subcommands:\n * - context: Browse and explore IDE context\n * - setup: Configure IDE settings (VSCode optimizations)\n * - sync: Sync .jai1 content to IDE directories\n */\nexport function createIdeCommand(): Command {\n const ideCommand = new Command('ide')\n .description('IDE integration and configuration commands');\n\n // Add subcommands\n ideCommand.addCommand(createContextSubcommand());\n ideCommand.addCommand(createSetupSubcommand());\n ideCommand.addCommand(createSyncSubcommand());\n\n // Default action - show help\n ideCommand.action(() => {\n ideCommand.help();\n });\n\n return ideCommand;\n}\n","/**\n * IDE Context Subcommand\n * Browse and explore IDE context (rules, workflows, skills, etc.)\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../../types/context.types.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\n/**\n * Create context subcommand for IDE group\n */\nexport function createContextSubcommand(): Command {\n const cmd = new Command('context')\n .description('Browse and explore IDE context (rules, workflows, skills)')\n .option('--target <ide>', 'Open specific IDE context (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Show specific content type (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Show context statistics (non-interactive)')\n .action(async (options: { target?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.target) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.target)) {\n console.error(`❌ Invalid IDE: ${options.target}`);\n console.error(` Valid IDEs: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.target as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Invalid content type: ${options.type}`);\n console.error(` Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Scanning context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ No context found');\n console.log(' Run `jai1 apply` to install context for your IDE.\\n');\n return;\n }\n\n console.log('📊 Context Statistics\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('en-US')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Total: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Error scanning context:', error);\n process.exit(1);\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { IDE, ContentType, IDEContext, ContextItem } from '../../types/context.types.js';\nimport { MainMenuView } from './views/MainMenuView.js';\nimport { IDEOverviewView } from './views/IDEOverviewView.js';\nimport { ListView } from './views/ListView.js';\nimport { DetailView } from './views/DetailView.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\nexport type ContextScreen = 'menu' | 'overview' | 'list' | 'detail';\n\ninterface ContextAppProps {\n initialIDE?: IDE;\n initialType?: ContentType;\n onExit: () => void;\n}\n\n/**\n * ContextApp - Interactive Context Visualizer\n */\nexport const ContextApp: React.FC<ContextAppProps> = ({ initialIDE, initialType, onExit }) => {\n const { exit } = useApp();\n const [screen, setScreen] = useState<ContextScreen>('menu');\n const [selectedIDE, setSelectedIDE] = useState<IDE | null>(initialIDE || null);\n const [selectedType, setSelectedType] = useState<ContentType | null>(initialType || null);\n const [selectedItem, setSelectedItem] = useState<ContextItem | null>(null);\n\n const [ideContexts, setIdeContexts] = useState<IDEContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Scan context on mount\n useEffect(() => {\n const scanner = new ContextScannerService();\n scanner.scanAll().then(result => {\n setIdeContexts(result.ides);\n setLoading(false);\n\n // If initialIDE is set, jump to overview\n if (initialIDE) {\n setScreen('overview');\n }\n }).catch(error => {\n console.error('Failed to scan context:', error);\n setLoading(false);\n });\n }, [initialIDE]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // q to quit (global)\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Escape or Backspace to go back (NOT in detail view - DetailView handles its own input)\n if (screen !== 'detail' && (key.escape || key.backspace)) {\n handleBack();\n return;\n }\n });\n\n const handleBack = () => {\n if (screen === 'detail') {\n setScreen('list');\n setSelectedItem(null);\n setScrollPosition(0);\n } else if (screen === 'list') {\n setScreen('overview');\n setSelectedType(null);\n } else if (screen === 'overview') {\n setScreen('menu');\n setSelectedIDE(null);\n } else {\n onExit();\n }\n };\n\n const handleSelectIDE = (ide: IDE) => {\n setSelectedIDE(ide);\n setScreen('overview');\n };\n\n const handleSelectType = (type: ContentType) => {\n setSelectedType(type);\n setScreen('list');\n };\n\n const handleSelectItem = (item: ContextItem) => {\n setSelectedItem(item);\n setScreen('detail');\n setScrollPosition(0);\n };\n\n // Get current IDE context\n const currentIDEContext = ideContexts.find(ctx => ctx.ide === selectedIDE);\n\n // Get current items for selected type\n const currentItems = currentIDEContext?.items?.filter(item => item.type === selectedType) ?? [];\n\n // Render appropriate view\n const renderContent = () => {\n if (loading) {\n return (\n <Box padding={1}>\n <Text>Đang quét context...</Text>\n </Box>\n );\n }\n\n switch (screen) {\n case 'menu':\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n case 'overview':\n return currentIDEContext ? (\n <IDEOverviewView\n ideContext={currentIDEContext}\n onSelectType={handleSelectType}\n onBack={handleBack}\n />\n ) : null;\n case 'list':\n return (\n <ListView\n items={currentItems}\n contentType={selectedType!}\n onSelect={handleSelectItem}\n onBack={handleBack}\n />\n );\n case 'detail':\n return selectedItem ? (\n <DetailView\n item={selectedItem}\n scrollPosition={scrollPosition}\n onBack={handleBack}\n />\n ) : null;\n default:\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n }\n };\n\n // Get footer hints based on screen\n const getFooterHints = () => {\n switch (screen) {\n case 'menu':\n return '[↑↓] Chọn · [Enter] Mở · [q] Thoát';\n case 'overview':\n return '[Tab/1-6] Chuyển tab · [Enter] Xem danh sách · [Esc/←] Quay lại · [q] Thoát';\n case 'list':\n return '[↑↓] Chọn · [Enter] Chi tiết · [Esc/←] Quay lại · [q] Thoát';\n case 'detail':\n return '[↑↓/j/k] Cuộn · [PgUp/u PgDn/d] Cuộn nhanh · [g/G] Đầu/Cuối · [Esc/←] Quay lại · [q] Thoát';\n default:\n return '[q] Thoát';\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📋 Jai1 Context</Text>\n <Text dimColor> - Khám phá context dự án</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{getFooterHints()}</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDE, IDEContext } from '../../../types/context.types.js';\n\ninterface MainMenuViewProps {\n ideContexts: IDEContext[];\n onSelect: (ide: IDE) => void;\n}\n\ninterface IDEMenuItem {\n ide: IDE;\n icon: string;\n title: string;\n itemCount: number;\n available: boolean;\n}\n\n/**\n * MainMenuView - IDE selector menu\n */\nexport const MainMenuView: React.FC<MainMenuViewProps> = ({ ideContexts, onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build menu items\n const menuItems: IDEMenuItem[] = [\n {\n ide: 'cursor',\n icon: '🔮',\n title: 'Cursor',\n itemCount: ideContexts.find(ctx => ctx.ide === 'cursor')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'cursor'),\n },\n {\n ide: 'windsurf',\n icon: '🏄',\n title: 'Windsurf',\n itemCount: ideContexts.find(ctx => ctx.ide === 'windsurf')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'windsurf'),\n },\n {\n ide: 'antigravity',\n icon: '🚀',\n title: 'Antigravity (Claude)',\n itemCount: ideContexts.find(ctx => ctx.ide === 'antigravity')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'antigravity'),\n },\n {\n ide: 'jai1',\n icon: '🤖',\n title: 'Jai1 Framework',\n itemCount: ideContexts.find(ctx => ctx.ide === 'jai1')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'jai1'),\n },\n ];\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item && item.available) {\n onSelect(item.ide);\n }\n }\n }, { isActive: true });\n\n // Format item count summary\n const formatSummary = (item: IDEMenuItem): string => {\n if (!item.available) {\n return 'Không có context';\n }\n\n const ctx = ideContexts.find(c => c.ide === item.ide);\n if (!ctx) return '';\n\n const parts: string[] = [];\n if (ctx.stats.byType.rules) parts.push(`${ctx.stats.byType.rules} rules`);\n if (ctx.stats.byType.workflows) parts.push(`${ctx.stats.byType.workflows} workflows`);\n if (ctx.stats.byType.skills) parts.push(`${ctx.stats.byType.skills} skills`);\n if (ctx.stats.byType.agents) parts.push(`${ctx.stats.byType.agents} agents`);\n if (ctx.stats.byType.prompts) parts.push(`${ctx.stats.byType.prompts} prompts`);\n\n return parts.join(', ') || `${item.itemCount} items`;\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"cyan\">Jai1 Context</Text>!</Text>\n <Text dimColor>\n Khám phá và quản lý context cho các IDE hỗ trợ Agentic Coding.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn IDE để khám phá:</Text>\n\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex;\n const dimmed = !item.available;\n\n return (\n <Box key={item.ide} marginY={0}>\n <Text color={isSelected ? 'cyan' : dimmed ? 'gray' : 'white'} dimColor={dimmed}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.available && (\n <Text dimColor> - {formatSummary(item)}</Text>\n )}\n {!item.available && (\n <Text dimColor> - Không có context</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n {ideContexts.length === 0 && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\n <Text color=\"yellow\">⚠️ Không tìm thấy context nào</Text>\n <Text dimColor>Hãy chạy </Text>\n <Text color=\"cyan\">jai1 apply</Text>\n <Text dimColor> để cài đặt context cho IDE của bạn.</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDEContext, ContentType } from '../../../types/context.types.js';\n\ninterface IDEOverviewViewProps {\n ideContext: IDEContext;\n onSelectType: (type: ContentType) => void;\n onBack: () => void;\n}\n\ninterface ContentTypeTab {\n type: ContentType;\n label: string;\n icon: string;\n count: number;\n}\n\n/**\n * IDEOverviewView - Overview of an IDE's context with tabs\n */\nexport const IDEOverviewView: React.FC<IDEOverviewViewProps> = ({\n ideContext,\n onSelectType,\n onBack,\n}) => {\n const [selectedTabIndex, setSelectedTabIndex] = useState(0);\n\n // Build tabs from available content types\n const tabs: ContentTypeTab[] = [];\n\n if (ideContext.stats.byType.rules) {\n tabs.push({\n type: 'rules',\n label: 'Rules',\n icon: '📜',\n count: ideContext.stats.byType.rules,\n });\n }\n if (ideContext.stats.byType.workflows) {\n tabs.push({\n type: 'workflows',\n label: 'Workflows',\n icon: '🔄',\n count: ideContext.stats.byType.workflows,\n });\n }\n if (ideContext.stats.byType.skills) {\n tabs.push({\n type: 'skills',\n label: 'Skills',\n icon: '🛠',\n count: ideContext.stats.byType.skills,\n });\n }\n if (ideContext.stats.byType.agents) {\n tabs.push({\n type: 'agents',\n label: 'Agents',\n icon: '🤖',\n count: ideContext.stats.byType.agents,\n });\n }\n if (ideContext.stats.byType.prompts) {\n tabs.push({\n type: 'prompts',\n label: 'Prompts',\n icon: '💬',\n count: ideContext.stats.byType.prompts,\n });\n }\n if (ideContext.stats.byType.context) {\n tabs.push({\n type: 'context',\n label: 'Context',\n icon: '📋',\n count: ideContext.stats.byType.context,\n });\n }\n\n useInput((input, key) => {\n // Tab navigation\n if (key.tab || key.rightArrow) {\n setSelectedTabIndex(prev => Math.min(tabs.length - 1, prev + 1));\n } else if (key.leftArrow) {\n setSelectedTabIndex(prev => Math.max(0, prev - 1));\n }\n\n // Number shortcuts (1-6)\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= tabs.length) {\n setSelectedTabIndex(num - 1);\n }\n\n // Enter to select\n if (key.return) {\n const tab = tabs[selectedTabIndex];\n if (tab) {\n onSelectType(tab.type);\n }\n }\n }, { isActive: true });\n\n // Get current tab\n const currentTab = tabs[selectedTabIndex];\n\n // Get items for current tab\n const currentItems = currentTab\n ? ideContext?.items?.filter(item => item.type === currentTab.type) ?? []\n : [];\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{ideContext.config.icon} {ideContext.config.name}</Text>\n </Box>\n\n {/* Summary Stats */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>📊 Tổng quan</Text>\n <Box marginTop={1}>\n <Text>\n 📁 Tổng: <Text bold color=\"cyan\">{ideContext.stats.totalItems} items</Text>\n </Text>\n <Text dimColor> · </Text>\n <Text>\n 💾 Kích thước: <Text bold>{formatSize(ideContext.stats.totalSize)}</Text>\n </Text>\n {ideContext.stats.lastModified && (\n <>\n <Text dimColor> · </Text>\n <Text>\n 🕐 Cập nhật: <Text bold>{formatDate(ideContext.stats.lastModified)}</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Content Type Tabs */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {/* Tab Headers */}\n <Box marginBottom={1}>\n {tabs.map((tab, index) => {\n const isSelected = index === selectedTabIndex;\n return (\n <Box key={tab.type} marginRight={1}>\n <Text\n color={isSelected ? 'cyan' : 'gray'}\n bold={isSelected}\n inverse={isSelected}\n >\n {' '}{tab.icon} {tab.label} ({tab.count}){' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Tab Content Preview */}\n {currentTab && currentItems.length > 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Preview (nhấn Enter để xem chi tiết):</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {currentItems.slice(0, 5).map(item => (\n <Box key={item.id} marginY={0}>\n <Text>• {item.name}</Text>\n {item.description && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n ))}\n {currentItems.length > 5 && (\n <Text dimColor>... và {currentItems.length - 5} items khác</Text>\n )}\n </Box>\n </Box>\n )}\n\n {currentTab && currentItems.length === 0 && (\n <Text dimColor>Không có items nào trong {currentTab.label}</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem, ContentType } from '../../../types/context.types.js';\n\ninterface ListViewProps {\n items: ContextItem[];\n contentType: ContentType;\n onSelect: (item: ContextItem) => void;\n onBack: () => void;\n}\n\n/**\n * ListView - List view for context items\n */\nexport const ListView: React.FC<ListViewProps> = ({ items, contentType, onSelect, onBack }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n onSelect(item);\n }\n }\n }, { isActive: true });\n\n // Get type label\n const getTypeLabel = (): string => {\n switch (contentType) {\n case 'rules':\n return '📜 Rules';\n case 'workflows':\n return '🔄 Workflows';\n case 'skills':\n return '🛠 Skills';\n case 'agents':\n return '🤖 Agents';\n case 'prompts':\n return '💬 Prompts';\n case 'context':\n return '📋 Context';\n default:\n return contentType;\n }\n };\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n if (items.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text dimColor>Không có items nào</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n <Text dimColor> - {items.length} items</Text>\n </Box>\n\n {/* Items List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginY={0}>\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.name}\n </Text>\n <Text dimColor> ({formatSize(item.fileSize)})</Text>\n </Box>\n\n {isSelected && (\n <Box marginLeft={3} flexDirection=\"column\">\n {item.description && (\n <Text dimColor>📝 {item.description}</Text>\n )}\n\n {/* Rules-specific metadata */}\n {contentType === 'rules' && (\n <>\n {item.alwaysApply && (\n <Text dimColor>✅ Always active</Text>\n )}\n {item.globs && item.globs.length > 0 && (\n <Text dimColor>🎯 Globs: {item.globs.join(', ')}</Text>\n )}\n </>\n )}\n\n {/* Skills-specific metadata */}\n {contentType === 'skills' && (\n <Box>\n {item.hasScripts && <Text dimColor>📦 scripts/ </Text>}\n {item.hasReferences && <Text dimColor>📚 references/ </Text>}\n {item.hasAssets && <Text dimColor>🎨 assets/ </Text>}\n </Box>\n )}\n\n {/* Agents-specific metadata */}\n {contentType === 'agents' && item.model && (\n <Text dimColor>🔧 Model: {item.model}</Text>\n )}\n\n <Text dimColor>📁 {item.relativePath}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem } from '../../../types/context.types.js';\n\ninterface DetailViewProps {\n item: ContextItem;\n scrollPosition: number;\n onBack: () => void;\n}\n\n/**\n * DetailView - Detail view for a context item with metadata and preview\n */\nexport const DetailView: React.FC<DetailViewProps> = ({ item, scrollPosition: initialScroll, onBack }) => {\n // Local scroll state\n const [scrollPosition, setScrollPosition] = useState(initialScroll);\n const maxVisibleLines = 25;\n const maxScroll = Math.max(0, item.previewLines.length - maxVisibleLines);\n\n // Handle keyboard input for scrolling\n useInput((input, key) => {\n // Scroll controls\n if (key.upArrow || input === 'k') {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageDown || input === 'd') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 5));\n } else if (key.pageUp || input === 'u') {\n setScrollPosition(prev => Math.max(0, prev - 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n // Back navigation\n else if (key.escape || key.backspace) {\n onBack();\n }\n }, { isActive: true });\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Get visible preview lines based on scroll\n const visibleLines = item.previewLines.slice(\n scrollPosition,\n scrollPosition + maxVisibleLines\n );\n\n const hasMoreAbove = scrollPosition > 0;\n const hasMoreBelow = scrollPosition + maxVisibleLines < item.previewLines.length;\n\n // Calculate scroll percentage\n const scrollPercentage = item.previewLines.length <= maxVisibleLines\n ? 100\n : Math.round((scrollPosition / maxScroll) * 100);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header with compact metadata */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">{item.name}</Text>\n <Box>\n <Text dimColor>{item.relativePath} • {formatSize(item.fileSize)}</Text>\n {item.description && <Text dimColor> • {item.description}</Text>}\n </Box>\n <Box>\n {/* Type-specific metadata in one line */}\n {item.type === 'rules' && item.globs && item.globs.length > 0 && (\n <Text dimColor>globs: {item.globs.join(', ')}</Text>\n )}\n {item.type === 'agents' && item.model && (\n <Text dimColor>model: {item.model}</Text>\n )}\n {item.type === 'skills' && (\n <Text dimColor>\n {item.hasScripts && '📦 scripts '}\n {item.hasReferences && '📚 refs '}\n {item.hasAssets && '🎨 assets'}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Preview Panel */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold>👁️ Preview</Text>\n {item.previewLines.length > maxVisibleLines && (\n <Text dimColor>\n [{scrollPosition + 1}-{Math.min(scrollPosition + maxVisibleLines, item.previewLines.length)}/{item.lineCount}] {scrollPercentage}%\n </Text>\n )}\n </Box>\n\n {hasMoreAbove && (\n <Box justifyContent=\"center\">\n <Text dimColor>▲ ▲ ▲ ({scrollPosition} dòng ở trên) ▲ ▲ ▲</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line, index) => {\n const lineNumber = scrollPosition + index + 1;\n return (\n <Box key={index}>\n <Text dimColor>{lineNumber.toString().padStart(3, ' ')}│ </Text>\n <Text>{line}</Text>\n </Box>\n );\n })}\n </Box>\n\n {hasMoreBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n ▼ ▼ ▼ ({item.lineCount - scrollPosition - visibleLines.length} dòng ở dưới) ▼ ▼ ▼\n </Text>\n </Box>\n )}\n\n {item.previewLines.length === 0 && (\n <Text dimColor>Không có nội dung để hiển thị</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport type {\n IDE,\n ContentType,\n ContextItem,\n IDEContext,\n ProjectContext,\n ContextStats,\n} from '../types/context.types.js';\nimport { IDE_CONFIGS, getAllIDEs } from '../constants/ide-configs.js';\n\n/**\n * Service for scanning and parsing context files\n */\nexport class ContextScannerService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Scan all IDEs for context\n */\n async scanAll(): Promise<ProjectContext> {\n const ides = await this.detectIDEs();\n const ideContexts: IDEContext[] = [];\n\n for (const ide of ides) {\n try {\n const context = await this.scanIDE(ide);\n if (context.items.length > 0) {\n ideContexts.push(context);\n }\n } catch (error) {\n // Skip IDEs that fail to scan\n console.error(`Failed to scan ${ide}:`, error);\n }\n }\n\n const totalItems = ideContexts.reduce((sum, ctx) => sum + ctx.items.length, 0);\n\n return {\n projectPath: this.projectPath,\n ides: ideContexts,\n totalItems,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific IDE\n */\n async scanIDE(ide: IDE): Promise<IDEContext> {\n const config = IDE_CONFIGS[ide];\n const items: ContextItem[] = [];\n\n // Scan each content type\n for (const [type, relativePath] of Object.entries(config.contentPaths)) {\n if (!relativePath) continue;\n\n const contentType = type as ContentType;\n try {\n const typeItems = await this.scanType(ide, contentType);\n items.push(...typeItems);\n } catch (error) {\n // Skip types that fail to scan (directory doesn't exist, etc.)\n }\n }\n\n const stats = this.calculateStats(items);\n\n return {\n ide,\n config,\n items,\n stats,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific content type\n */\n async scanType(ide: IDE, type: ContentType): Promise<ContextItem[]> {\n const config = IDE_CONFIGS[ide];\n const relativePath = config.contentPaths[type];\n if (!relativePath) return [];\n\n let dirPath: string;\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1', relativePath);\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework', relativePath);\n\n // Use whichever path exists\n if (await this.pathExists(jai1Path)) {\n dirPath = jai1Path;\n } else if (await this.pathExists(frameworkPath)) {\n dirPath = frameworkPath;\n } else {\n return [];\n }\n } else {\n dirPath = path.join(this.projectPath, config.basePath, relativePath);\n\n // Check if directory exists\n try {\n await fs.access(dirPath);\n } catch {\n return [];\n }\n }\n\n const extensions = config.fileExtensions[type] || [];\n const items: ContextItem[] = [];\n\n // Special handling for skills (folders with SKILL.md)\n if (type === 'skills') {\n const skillItems = await this.scanSkills(dirPath, ide);\n items.push(...skillItems);\n } else {\n // Regular files\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n\n if (!stat.isFile()) continue;\n\n // Check if file matches extensions\n const matchesExtension = extensions.some(ext => file.endsWith(ext));\n if (!matchesExtension) continue;\n\n try {\n const item = await this.parseContextItem(filepath, ide, type);\n items.push(item);\n } catch (error) {\n console.error(`Failed to parse ${filepath}:`, error);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Scan skills (folders with SKILL.md)\n */\n private async scanSkills(skillsDir: string, ide: IDE): Promise<ContextItem[]> {\n const items: ContextItem[] = [];\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = path.join(skillsDir, entry.name);\n const skillFilePath = path.join(skillPath, 'SKILL.md');\n\n // Check if SKILL.md exists\n try {\n await fs.access(skillFilePath);\n } catch {\n continue;\n }\n\n // Parse SKILL.md\n const item = await this.parseContextItem(skillFilePath, ide, 'skills');\n\n // Check for additional folders\n item.hasScripts = await this.pathExists(path.join(skillPath, 'scripts'));\n item.hasReferences = await this.pathExists(path.join(skillPath, 'references'));\n item.hasAssets = await this.pathExists(path.join(skillPath, 'assets'));\n\n items.push(item);\n }\n } catch (error) {\n console.error(`Failed to scan skills:`, error);\n }\n\n return items;\n }\n\n /**\n * Parse a context item from file\n */\n private async parseContextItem(\n filepath: string,\n ide: IDE,\n type: ContentType\n ): Promise<ContextItem> {\n const content = await fs.readFile(filepath, 'utf-8');\n const stat = await fs.stat(filepath);\n\n // Parse frontmatter\n const { data: frontmatter, content: bodyContent } = matter(content);\n\n // Extract description\n const config = IDE_CONFIGS[ide];\n const description = frontmatter[config.frontmatterSchema.descriptionField] as string | undefined;\n\n // Extract globs/trigger info\n let globs: string[] | undefined;\n let alwaysApply: boolean | undefined;\n\n if (config.frontmatterSchema.alwaysApplyField) {\n const alwaysField = frontmatter[config.frontmatterSchema.alwaysApplyField];\n alwaysApply = alwaysField === true || alwaysField === 'always' || alwaysField === 'always_on';\n }\n\n const triggerValue = frontmatter[config.frontmatterSchema.triggerField];\n if (typeof triggerValue === 'string') {\n globs = [triggerValue];\n } else if (Array.isArray(triggerValue)) {\n globs = triggerValue;\n }\n\n // Extract preview lines\n const { previewLines, lineCount } = this.extractPreview(bodyContent, 20);\n\n // Generate ID\n const relativePath = path.relative(this.projectPath, filepath);\n const id = `${ide}-${type}-${path.basename(filepath, path.extname(filepath))}`;\n\n // Extract name\n const name = frontmatter.name || path.basename(filepath, path.extname(filepath));\n\n return {\n id,\n ide,\n type,\n name,\n filepath,\n relativePath,\n frontmatter,\n description,\n globs,\n alwaysApply,\n model: frontmatter.model as string | undefined,\n fileSize: stat.size,\n modifiedAt: stat.mtime,\n previewLines,\n lineCount,\n };\n }\n\n /**\n * Extract preview lines (after frontmatter)\n */\n private extractPreview(content: string, maxLines: number = 20): { previewLines: string[]; lineCount: number } {\n const lines = content.split('\\n');\n const previewLines = lines.slice(0, maxLines);\n const lineCount = lines.length;\n\n return { previewLines, lineCount };\n }\n\n /**\n * Detect available IDEs in project\n */\n async detectIDEs(): Promise<IDE[]> {\n const ides: IDE[] = [];\n\n for (const ide of getAllIDEs()) {\n const config = IDE_CONFIGS[ide];\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1');\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework');\n\n if (await this.pathExists(jai1Path) || await this.pathExists(frameworkPath)) {\n ides.push(ide);\n }\n } else {\n const idePath = path.join(this.projectPath, config.basePath);\n if (await this.pathExists(idePath)) {\n ides.push(ide);\n }\n }\n }\n\n return ides;\n }\n\n /**\n * Check if path exists\n */\n private async pathExists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate statistics from items\n */\n private calculateStats(items: ContextItem[]): ContextStats {\n const byType: Partial<Record<ContentType, number>> = {};\n\n for (const item of items) {\n byType[item.type] = (byType[item.type] || 0) + 1;\n }\n\n const totalSize = items.reduce((sum, item) => sum + item.fileSize, 0);\n\n const lastModified = items.length > 0\n ? items.reduce((latest, item) =>\n item.modifiedAt > latest ? item.modifiedAt : latest,\n items[0]!.modifiedAt\n )\n : null;\n\n return {\n totalItems: items.length,\n byType,\n totalSize,\n lastModified,\n };\n }\n}\n","import type { IDE, IDEConfig } from '../types/context.types.js';\n\n/**\n * IDE configurations for context scanning\n */\nexport const IDE_CONFIGS: Record<IDE, IDEConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n contentPaths: {\n rules: 'rules',\n workflows: 'commands', // Cursor uses \"commands\" for workflows\n },\n fileExtensions: {\n rules: ['.mdc'], // Cursor-specific markdown\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always'\n descriptionField: 'description',\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity (Claude)',\n icon: '🚀',\n basePath: '.agent',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always_on'\n descriptionField: 'description',\n },\n },\n jai1: {\n id: 'jai1',\n name: 'Jai1 Framework',\n icon: '🤖',\n basePath: '.jai1', // Or packages/jai1-framework\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n skills: 'skills', // Folders with SKILL.md\n agents: 'agents',\n prompts: 'prompts',\n context: 'context',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n skills: ['SKILL.md'], // Special handling for skill folders\n agents: ['.md'],\n prompts: ['.md'],\n context: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n};\n\n/**\n * Get IDE config by ID\n */\nexport function getIDEConfig(ide: IDE): IDEConfig {\n return IDE_CONFIGS[ide];\n}\n\n/**\n * Get all IDE IDs\n */\nexport function getAllIDEs(): IDE[] {\n return Object.keys(IDE_CONFIGS) as IDE[];\n}\n","/**\n * IDE Setup Subcommand\n * Configure IDE settings (VSCode optimizations, etc.)\n * \n * This is a wrapper that re-exports the existing vscode command\n * but as a subcommand under 'ide setup'\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Disable all telemetry and data collection',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Disable/reduce language server load (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Disable built-in Git for better performance',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Exclude directories from file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Exclude directories from search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Disable auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Optimize rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Hide unnecessary UI elements',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\n/**\n * Create setup subcommand for IDE group\n * Manages IDE settings (VSCode optimizations)\n */\nexport function createSetupSubcommand(): Command {\n const setupCommand = new Command('setup')\n .description('Configure IDE settings and optimizations');\n\n // Interactive mode (default)\n setupCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n setupCommand\n .command('enable')\n .description('Enable specific optimization groups')\n .argument('[groups...]', 'Group names to enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n setupCommand\n .command('disable')\n .description('Disable specific optimization groups (restore to default)')\n .argument('[groups...]', 'Group names to disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n setupCommand\n .command('max-performance')\n .description('Enable all optimizations for maximum performance')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n setupCommand\n .command('reset')\n .description('Reset to default settings (remove all optimizations)')\n .argument('[groups...]', 'Group names to reset (empty = reset all)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n setupCommand\n .command('list')\n .description('List all available optimization groups')\n .action(() => {\n console.log('🔧 Available optimization groups:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return setupCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 IDE Settings Manager\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Usage: │');\n console.log('│ • Use ↑↓ keys to navigate │');\n console.log('│ • Press SPACE to select/deselect group │');\n console.log('│ • Press ENTER to confirm and apply │');\n console.log('│ • Press Ctrl+C to cancel │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'What do you want to do?',\n choices: [\n { name: '✅ Enable optimization groups', value: 'enable' },\n { name: '❌ Disable optimization groups', value: 'disable' },\n { name: '🚀 Max Performance (enable all)', value: 'max' },\n { name: '🔄 Reset to defaults', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Select groups to ${action} (SPACE to select, ENTER to confirm):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ No groups selected!');\n console.log(' 💡 Tip: Press SPACE to select at least 1 group before pressing ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Operation cancelled.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Invalid groups: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Run \"jai1 ide setup list\" to see available groups.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Created .vscode/ directory');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Read current settings from settings.json');\n } catch {\n console.warn('⚠️ Cannot read settings.json (may contain comments).');\n const confirmOverwrite = await confirm({\n message: 'Overwrite current settings.json file?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Operation cancelled.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 ${action === 'enable' ? 'Enabling' : 'Disabling'} groups:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Updated IDE settings at: ${settingsPath}`);\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ No settings.json file found');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset ALL settings to default (delete entire file)?'\n : `Reset groups: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Operation cancelled.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Deleted settings.json file');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n","/**\n * IDE Sync Subcommand\n * Sync .jai1 content to IDE directories (rules, workflows, commands)\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\n\n/**\n * Create sync subcommand for IDE group\n * Syncs .jai1 content to IDE-specific directories\n */\nexport function createSyncSubcommand(): Command {\n const cmd = new Command('sync')\n .description('Sync .jai1 content to IDE directories (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runSync(options);\n });\n\n return cmd;\n}\n\nasync function runSync(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Sync rules and workflows to IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ No content found in .jai1/');\n console.log(' 💡 Create files in .jai1/rules/ or .jai1/workflows/ first.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Select target IDE(s) (SPACE to select, ENTER to confirm):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ No IDE selected!');\n console.log(' 💡 Select at least 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Select content types to sync:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ No content type selected!');\n console.log(' 💡 Select at least 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with sync?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Sync cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Syncing...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Sync complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","/**\n * Migration service for IDE content migration\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport type {\n MigrateIDE,\n MigrateContentType,\n SourceContentItem,\n MigrationResult,\n ScanSummary,\n IDEMigrationConfig,\n} from '../types/migrate-ide.types.js';\nimport { IDE_MIGRATION_CONFIGS } from '../constants/ide-migration-configs.js';\n\nexport class MigrateIdeService {\n private projectPath: string;\n private jai1Path: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.jai1Path = path.join(projectPath, '.jai1');\n }\n\n /**\n * Scan .jai1/ directory for content\n */\n async scanJai1Content(): Promise<ScanSummary> {\n const rules = await this.scanContentType('rules');\n const workflows = await this.scanContentType('workflows');\n const commands: SourceContentItem[] = [];\n\n return {\n rules,\n workflows,\n commands,\n totalCount: rules.length + workflows.length + commands.length,\n };\n }\n\n /**\n * Scan a specific content type\n */\n private async scanContentType(type: MigrateContentType): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const dirPath = path.join(this.jai1Path, type);\n\n try {\n await fs.access(dirPath);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n const { data: frontmatter } = matter(content);\n\n items.push({\n type,\n name: path.basename(file, '.md'),\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n alwaysApply: this.extractAlwaysApply(frontmatter),\n });\n }\n\n return items;\n }\n\n /**\n * Generate stub file content with @ reference\n */\n generateStubContent(\n ide: MigrateIDE,\n sourceItem: SourceContentItem\n ): string {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) throw new Error(`Unknown IDE: ${ide}`);\n\n // Generate IDE-specific frontmatter\n const frontmatter = config.generateFrontmatter({\n description: sourceItem.description,\n globs: sourceItem.globs,\n alwaysApply: sourceItem.alwaysApply,\n sourceFile: sourceItem.relativePath,\n });\n\n // Generate @ reference\n const reference = `@${sourceItem.relativePath}`;\n\n // Combine frontmatter and reference\n if (frontmatter) {\n return `${frontmatter}\\n\\n${reference}\\n`;\n }\n return `${reference}\\n`;\n }\n\n /**\n * Migrate content to specific IDEs\n */\n async migrate(\n ides: MigrateIDE[],\n contentTypes: MigrateContentType[],\n content: ScanSummary,\n onProgress?: (result: MigrationResult) => void\n ): Promise<MigrationResult[]> {\n const results: MigrationResult[] = [];\n\n for (const ide of ides) {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) continue;\n\n // Migrate each content type\n for (const type of contentTypes) {\n const items = type === 'rules' ? content.rules :\n type === 'workflows' ? content.workflows :\n content.commands;\n\n for (const item of items) {\n const result = await this.migrateItem(ide, config, item);\n results.push(result);\n onProgress?.(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Migrate a single item\n */\n private async migrateItem(\n ide: MigrateIDE,\n config: IDEMigrationConfig,\n item: SourceContentItem\n ): Promise<MigrationResult> {\n try {\n // Determine target path\n const targetPath = this.getTargetPath(config, item);\n\n if (!targetPath) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'skipped',\n error: `IDE ${config.id} does not support ${item.type}`,\n };\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n await fs.mkdir(targetDir, { recursive: true });\n\n // Check if file exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(targetPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate stub content\n const stubContent = this.generateStubContent(ide, item);\n\n // Write file\n await fs.writeFile(targetPath, stubContent, 'utf-8');\n\n return {\n source: item,\n targetIDE: ide,\n targetPath,\n status,\n };\n } catch (error) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get target file path for an item\n */\n private getTargetPath(config: IDEMigrationConfig, item: SourceContentItem): string | null {\n let contentPath: string | null = null;\n\n switch (item.type) {\n case 'rules':\n contentPath = config.rulesPath;\n break;\n case 'workflows':\n contentPath = config.workflowsPath;\n break;\n case 'commands':\n contentPath = config.commandsPath;\n break;\n }\n\n if (!contentPath) {\n return null;\n }\n\n const filename = `${item.name}${config.fileExtension}`;\n return path.join(this.projectPath, config.basePath, contentPath, filename);\n }\n\n // Helper methods\n private extractGlobs(frontmatter: Record<string, unknown>): string[] | undefined {\n const globs = frontmatter.globs;\n if (typeof globs === 'string') return [globs];\n if (Array.isArray(globs)) return globs as string[];\n return undefined;\n }\n\n private extractAlwaysApply(frontmatter: Record<string, unknown>): boolean {\n return frontmatter.alwaysApply === true ||\n frontmatter.trigger === 'always' ||\n frontmatter.trigger === 'always_on';\n }\n}\n","/**\n * IDE migration configurations\n */\nimport type { IDEMigrationConfig, FrontmatterOptions, MigrateIDE } from '../types/migrate-ide.types.js';\n\nexport const IDE_MIGRATION_CONFIGS: Record<MigrateIDE, IDEMigrationConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.mdc',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n if (opts.globs && opts.globs.length > 0) {\n lines.push(`globs: ${opts.globs.join(', ')}`);\n }\n lines.push(`alwaysApply: ${opts.alwaysApply}`);\n lines.push('---');\n return lines.join('\\n');\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '🚀',\n basePath: '.agent',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n claudecode: {\n id: 'claudecode',\n name: 'Claude Code',\n icon: '🤖',\n basePath: '.claude',\n rulesPath: null,\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n if (opts.description) {\n return `---\\ndescription: ${opts.description}\\n---`;\n }\n return '';\n },\n },\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n icon: '💻',\n basePath: '.opencode',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n};\n\nexport function getMigrationIDEs(): MigrateIDE[] {\n return Object.keys(IDE_MIGRATION_CONFIGS) as MigrateIDE[];\n}\n\nexport function getIDEConfig(ide: MigrateIDE): IDEMigrationConfig | undefined {\n return IDE_MIGRATION_CONFIGS[ide];\n}\n","/**\n * Learn Command\n * Interactive guide center for Agentic Coding\n * \n * Renamed from 'guide' to 'learn' for clarity and brevity\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create learn command - Agentic Coding guide center\n */\nexport function createLearnCommand(): Command {\n const cmd = new Command('learn')\n .description('Interactive Agentic Coding learning center')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { MenuView } from './views/MenuView.js';\nimport { IntroView } from './views/IntroView.js';\nimport { RulesView } from './views/RulesView.js';\nimport { WorkflowsView } from './views/WorkflowsView.js';\nimport { PromptsView } from './views/PromptsView.js';\nimport { SkillsView } from './views/SkillsView.js';\nimport { AgenticGuideView } from './views/AgenticGuideView.js';\n\nexport type GuideTopic = 'menu' | 'intro' | 'rules' | 'workflows' | 'prompts' | 'skills' | 'agentic';\n\ninterface GuideAppProps {\n initialTopic?: string;\n onExit: () => void;\n}\n\nconst TOPIC_MAP: Record<string, GuideTopic> = {\n intro: 'intro',\n rules: 'rules',\n workflows: 'workflows',\n prompts: 'prompts',\n skills: 'skills',\n agentic: 'agentic',\n};\n\n/**\n * GuideApp - Interactive Agentic Coding Guide Center\n */\nexport const GuideApp: React.FC<GuideAppProps> = ({ initialTopic, onExit }) => {\n const { exit } = useApp();\n const [currentTopic, setCurrentTopic] = useState<GuideTopic>('menu');\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Set initial topic from CLI option\n useEffect(() => {\n if (initialTopic && TOPIC_MAP[initialTopic]) {\n setCurrentTopic(TOPIC_MAP[initialTopic]!);\n }\n }, [initialTopic]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape or Backspace to go back to menu\n if (key.escape || (currentTopic !== 'menu' && key.backspace)) {\n if (currentTopic === 'menu') {\n onExit();\n } else {\n setCurrentTopic('menu');\n setScrollPosition(0);\n }\n return;\n }\n\n // q to quit\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Scroll in content views\n if (currentTopic !== 'menu' && currentTopic !== 'agentic') {\n if (key.upArrow) {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollPosition(prev => prev + 1);\n } else if (key.pageDown) {\n setScrollPosition(prev => prev + 5);\n } else if (key.pageUp) {\n setScrollPosition(prev => Math.max(0, prev - 5));\n }\n }\n });\n\n const handleSelectTopic = (topic: GuideTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n };\n\n const handleBack = () => {\n setCurrentTopic('menu');\n setScrollPosition(0);\n };\n\n // Render appropriate view\n const renderContent = () => {\n switch (currentTopic) {\n case 'menu':\n return <MenuView onSelect={handleSelectTopic} />;\n case 'intro':\n return <IntroView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'rules':\n return <RulesView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'workflows':\n return <WorkflowsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'prompts':\n return <PromptsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'skills':\n return <SkillsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'agentic':\n return <AgenticGuideView onBack={handleBack} />;\n default:\n return <MenuView onSelect={handleSelectTopic} />;\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">🎓 Jai1 Guide</Text>\n <Text dimColor> - Trung tâm hướng dẫn Agentic Coding</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {currentTopic === 'menu'\n ? '[↑↓] Chọn · [Enter] Mở · [q] Thoát'\n : '[↑↓/PgUp/PgDn] Cuộn · [Esc/←] Quay lại · [q] Thoát'\n }\n </Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { GuideTopic } from '../GuideApp.js';\n\ninterface MenuViewProps {\n onSelect: (topic: GuideTopic) => void;\n}\n\ninterface MenuItem {\n id: GuideTopic;\n icon: string;\n title: string;\n description: string;\n badge?: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n {\n id: 'intro',\n icon: '📖',\n title: 'Giới thiệu Agentic Coding',\n description: 'Tổng quan về AI-assisted development và Jai1 Framework',\n },\n {\n id: 'rules',\n icon: '📜',\n title: 'IDE Rules',\n description: 'Quy tắc hướng dẫn AI hiểu context dự án của bạn',\n },\n {\n id: 'workflows',\n icon: '🔄',\n title: 'Workflows',\n description: 'Quy trình làm việc step-by-step (Cursor: Commands)',\n },\n {\n id: 'prompts',\n icon: '💬',\n title: 'Prompts',\n description: 'Cách viết prompts hiệu quả cho AI',\n },\n {\n id: 'skills',\n icon: '🛠',\n title: 'Skills',\n description: 'Mở rộng khả năng AI với skills chuyên biệt',\n },\n {\n id: 'agentic',\n icon: '🤖',\n title: 'Agentic Guide',\n description: 'Hỏi đáp trực tiếp với AI (interactive Q&A)',\n badge: 'Beta',\n },\n];\n\n/**\n * MenuView - Main menu showing all guide topics\n */\nexport const MenuView: React.FC<MenuViewProps> = ({ onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(MENU_ITEMS.length - 1, prev + 1));\n } else if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item) {\n onSelect(item.id);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"magenta\">Jai1 Guide</Text>!</Text>\n <Text dimColor>\n Đây là trung tâm hướng dẫn giúp bạn làm chủ Agentic Coding -\n </Text>\n <Text dimColor>\n phương pháp phát triển phần mềm với sự hỗ trợ của AI.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn chủ đề để tìm hiểu:</Text>\n\n {MENU_ITEMS.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.badge && (\n <Text color=\"yellow\" dimColor> [{item.badge}]</Text>\n )}\n {isSelected && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n <Box marginTop={1}>\n <Text dimColor>💡 Tip: Dùng </Text>\n <Text color=\"cyan\">jai1 guide --topic rules</Text>\n <Text dimColor> để mở trực tiếp một chủ đề</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface IntroViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst INTRO_CONTENT = [\n {\n type: 'header' as const,\n text: '📖 Giới thiệu Agentic Coding',\n },\n {\n type: 'section' as const,\n title: 'Agentic Coding là gì?',\n content: `Agentic Coding (hay Agentic Software Development - ASD) là phương pháp \nphát triển phần mềm với sự hỗ trợ của AI agents. AI không chỉ suggest code, \nmà còn chủ động:\n • Đọc và hiểu codebase của bạn\n • Thực thi commands và scripts\n • Tạo, sửa, xóa files\n • Chạy tests và debug\n • Tương tác với terminal và browser`,\n },\n {\n type: 'section' as const,\n title: 'Jai1 Framework là gì?',\n content: `Jai1 là framework giúp bạn làm việc hiệu quả với AI agents trong các IDE:\n • Cursor\n • Windsurf \n • Claude Code\n • GitHub Copilot Workspace\n • Codeium\n\nFramework cung cấp:\n 📜 Rules - Quy tắc hướng dẫn AI hiểu dự án\n 🔄 Workflows - Quy trình làm việc step-by-step\n 💬 Prompts - Templates prompts hiệu quả\n 🛠 Skills - Mở rộng khả năng AI`,\n },\n {\n type: 'section' as const,\n title: 'Tại sao cần Jai1?',\n content: `AI agents mạnh mẽ, nhưng cần \"context\" để làm việc hiệu quả:\n \n ❌ Không có context:\n \"Tạo một API endpoint\" → AI không biết tech stack, conventions\n\n ✅ Có Jai1 Framework:\n \"Tạo một API endpoint\" → AI đọc rules, hiểu bạn dùng HonoJS,\n biết cấu trúc thư mục, coding conventions, tự động follow best practices`,\n },\n {\n type: 'section' as const,\n title: 'Bắt đầu nhanh',\n content: `1. Khởi tạo Jai1 trong dự án:\n $ jai1 init\n\n2. Cài đặt components cần thiết:\n $ jai1 apply\n\n3. Sử dụng workflows trong IDE:\n Gõ @workflow hoặc /workflow để trigger\n\n4. Tùy chỉnh rules theo dự án của bạn:\n Sửa files trong .jai1/rules/`,\n },\n {\n type: 'tip' as const,\n text: 'Tiếp theo, tìm hiểu về Rules - nền tảng quan trọng nhất của Agentic Coding!',\n },\n];\n\n/**\n * IntroView - Introduction to Agentic Coding\n */\nexport const IntroView: React.FC<IntroViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={INTRO_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ContentItem {\n type: 'header' | 'section' | 'tip' | 'warning';\n text?: string;\n title?: string;\n content?: string;\n}\n\ninterface ContentViewProps {\n content: ContentItem[];\n scrollPosition: number;\n}\n\n/**\n * ContentView - Scrollable content container for guide views\n */\nexport const ContentView: React.FC<ContentViewProps> = ({ content, scrollPosition }) => {\n // Flatten content into lines for scrolling\n const renderContent = () => {\n const lines: React.ReactNode[] = [];\n\n content.forEach((item, idx) => {\n switch (item.type) {\n case 'header':\n lines.push(\n <Box key={`header-${idx}`} marginBottom={1}>\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={2}\n paddingY={0}\n >\n <Text bold color=\"magenta\">{item.text}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'section':\n lines.push(\n <Box key={`section-${idx}`} flexDirection=\"column\" marginBottom={1}>\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n <Text bold color=\"cyan\">{item.title}</Text>\n </Box>\n <Box marginLeft={1} marginTop={1}>\n <Text>{item.content}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'tip':\n lines.push(\n <Box\n key={`tip-${idx}`}\n borderStyle=\"round\"\n borderColor=\"green\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"green\">💡 Tip: {item.text}</Text>\n </Box>\n );\n break;\n\n case 'warning':\n lines.push(\n <Box\n key={`warning-${idx}`}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"yellow\">⚠️ Lưu ý: {item.text}</Text>\n </Box>\n );\n break;\n }\n });\n\n return lines;\n };\n\n const allLines = renderContent();\n const visibleLines = allLines.slice(scrollPosition, scrollPosition + 15);\n const hasMore = scrollPosition + 15 < allLines.length;\n const hasPrevious = scrollPosition > 0;\n\n return (\n <Box flexDirection=\"column\">\n {/* Scroll indicator top */}\n {hasPrevious && (\n <Box justifyContent=\"center\">\n <Text dimColor>↑ Cuộn lên để xem thêm</Text>\n </Box>\n )}\n\n {/* Content */}\n <Box flexDirection=\"column\">\n {visibleLines}\n </Box>\n\n {/* Scroll indicator bottom */}\n {hasMore && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>↓ Cuộn xuống để xem thêm ({allLines.length - scrollPosition - 15} items)</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface RulesViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst RULES_CONTENT = [\n {\n type: 'header' as const,\n text: '📜 IDE Rules - Quy tắc cho AI',\n },\n {\n type: 'section' as const,\n title: 'Rules là gì?',\n content: `Rules là các file Markdown chứa hướng dẫn cho AI agent. \nChúng giúp AI hiểu:\n • Tech stack của dự án (Laravel, NestJS, React...)\n • Coding conventions (naming, patterns...)\n • Cấu trúc thư mục và architecture\n • Business logic và domain knowledge`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Thư mục │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Rules │ .cursor/rules/ │\n│ Windsurf │ Rules │ .windsurf/rules/ │\n│ Antigravity │ Rules │ .agent/rules/ │\n│ Claude Code │ CLAUDE.md │ CLAUDE.md (root) │\n│ Copilot │ Instructions │ .github/copilot/ │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Rule file',\n content: `---\ndescription: [Mô tả ngắn khi nào rule này được apply]\nglobs: [Optional - file patterns để auto-apply]\n---\n\n# Tên Rule\n\n## Purpose\nGiải thích mục đích của rule\n\n## Conventions\nCác quy tắc cần tuân theo\n\n## Examples\nVí dụ minh họa (nếu cần)`,\n },\n {\n type: 'section' as const,\n title: 'Các loại Rules',\n content: `1. Global Rules (always active)\n • Conventions chung của dự án\n • Tech stack và dependencies\n • Coding style guidelines\n\n2. Contextual Rules (auto-applied by globs)\n • Frontend rules (cho *.tsx, *.vue...)\n • Backend rules (cho routes, controllers...)\n • Testing rules (cho *.test.*, *.spec.*)\n\n3. On-demand Rules\n • Gọi khi cần bằng @ruleName\n • Ví dụ: @database-migration, @api-design`,\n },\n {\n type: 'section' as const,\n title: 'Best Practices',\n content: `✅ DO:\n • Viết rules ngắn gọn, dễ đọc\n • Focus vào \"what to do\", không phải \"how to do\"\n • Cập nhật rules khi dự án thay đổi\n • Chia nhỏ rules theo domain/feature\n\n❌ DON'T:\n • Viết rules quá dài (>1000 tokens)\n • Copy-paste toàn bộ documentation\n • Include code examples quá chi tiết\n • Hardcode paths hoặc values`,\n },\n {\n type: 'tip' as const,\n text: 'Dùng \"jai1 apply rules/...\" để cài đặt rules mẫu cho tech stack của bạn!',\n },\n];\n\n/**\n * RulesView - Guide for IDE Rules\n */\nexport const RulesView: React.FC<RulesViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={RULES_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface WorkflowsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst WORKFLOWS_CONTENT = [\n {\n type: 'header' as const,\n text: '🔄 Workflows - Quy trình làm việc',\n },\n {\n type: 'section' as const,\n title: 'Workflows là gì?',\n content: `Workflows là tập hợp các bước tuần tự để AI thực hiện một tác vụ phức tạp.\nThay vì viết prompt dài dòng, bạn chỉ cần trigger workflow.\n\nVí dụ: /develop-feature\n → AI tự động: đọc task → plan → code → test → commit`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Cách trigger │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Commands │ / hoặc @command │\n│ Windsurf │ Workflows │ @workflow │\n│ Antigravity │ Workflows │ /workflow │\n│ Claude Code │ (Manual) │ Gọi CLAUDE.md │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc Workflow file',\n content: `---\ndescription: [Mô tả ngắn về workflow]\n---\n\n# Tên Workflow\n\n## ⚠️ CRITICAL RULES\nCác quy tắc bắt buộc phải tuân theo\n\n## 🎯 INPUT\nNhững gì cần có trước khi bắt đầu\n\n## 🔄 WORKFLOW PHASES\n### Phase 1: [Tên phase]\n- Step-by-step instructions\n- Commands to run\n- Validations to check\n\n### Phase 2: [Tên phase]\n...\n\n## ✅ QUALITY CHECKLIST\nChecklist kiểm tra khi hoàn thành`,\n },\n {\n type: 'section' as const,\n title: 'Workflows có sẵn trong Jai1',\n content: `/develop-feature Phát triển feature mới với auto-implement\n/fix-feature Sửa bugs với root cause analysis\n/commit-it Safe commit với security checks\n/gen-single-docs Generate documentation cho feature\n/setup-honojs Setup HonoJS + Drizzle cho dự án\n/create-prd Tạo Product Requirements Document`,\n },\n {\n type: 'section' as const,\n title: 'Đặc điểm của Workflow tốt',\n content: `✅ Continuous Execution\n • AI chạy liền mạch, không dừng hỏi user trừ khi thật sự cần\n\n✅ Progress Tracking\n • Tạo todo.md để track tiến độ\n • Hỗ trợ auto-resume từ checkpoint\n\n✅ Quality Gates\n • Có validation ở mỗi phase\n • Checklist kiểm tra cuối cùng\n\n✅ Error Handling\n • Xử lý errors gracefully\n • Có rollback plan khi thất bại`,\n },\n {\n type: 'tip' as const,\n text: 'Workflows mạnh nhất khi kết hợp với Rules - AI sẽ follow cả quy trình lẫn conventions!',\n },\n];\n\n/**\n * WorkflowsView - Guide for Workflows\n */\nexport const WorkflowsView: React.FC<WorkflowsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={WORKFLOWS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface PromptsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst PROMPTS_CONTENT = [\n {\n type: 'header' as const,\n text: '💬 Prompts - Giao tiếp hiệu quả với AI',\n },\n {\n type: 'section' as const,\n title: 'Prompts trong Agentic Coding',\n content: `Trong Agentic Coding, prompts không chỉ là \"hỏi một câu\" - \nmà là cách bạn định hướng AI thực hiện công việc phức tạp.\n\nVới Jai1 Framework, AI đã có sẵn context từ Rules,\nnên prompts của bạn có thể ngắn gọn và tập trung vào mục đích.`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Patterns hiệu quả',\n content: `1. ⚡ Quick Task Pattern\n \"Tạo API endpoint cho user registration\"\n → AI tự áp dụng conventions từ rules\n\n2. 📋 Task with Context Pattern \n \"Tạo API endpoint cho user registration.\n Bảng users: id, email, password_hash, created_at\"\n → Thêm context cụ thể cho task\n\n3. 🔄 Workflow Trigger Pattern\n \"@workflow develop-feature: Implement user login\"\n → Trigger toàn bộ workflow\n\n4. 🎯 Constraint Pattern\n \"Refactor UserService. Giữ nguyên public interface, \n chỉ extract private methods\"\n → Định rõ giới hạn`,\n },\n {\n type: 'section' as const,\n title: 'DO vs DON\\'T',\n content: `✅ NÊN:\n • Nêu rõ mục đích (\"để làm gì\")\n • Cung cấp context cụ thể\n • Định scope rõ ràng\n • Mention files/functions liên quan\n\n❌ KHÔNG NÊN:\n • Viết quá dài (AI mất focus)\n • Yêu cầu mơ hồ (\"fix bugs\")\n • Giả định AI biết context không có trong rules\n • Hỏi nhiều việc trong 1 prompt`,\n },\n {\n type: 'section' as const,\n title: 'Levels of Prompting',\n content: `Level 1: Simple (có Rules)\n \"Tạo model Product\"\n → AI follow conventions từ rules\n\nLevel 2: Guided (có context)\n \"Tạo model Product với: name, price, category_id, status\"\n → AI có thêm thông tin cụ thể\n\nLevel 3: Workflow\n \"@workflow: develop-feature Product CRUD\"\n → AI chạy toàn bộ quy trình\n\nLevel 4: Collaborative\n Chat multi-turn với AI để refine solution\n → Phù hợp với complex problems`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Templates trong Jai1',\n content: `Jai1 cung cấp prompt templates cho các use cases phổ biến:\n\n prompts/code-review.md Review và improve code\n prompts/debug-issue.md Debug với context đầy đủ\n prompts/explain-code.md Giải thích code cho team\n prompts/refactor.md Refactor patterns\n \nCài đặt: jai1 apply prompts/...`,\n },\n {\n type: 'tip' as const,\n text: 'Prompts ngắn + Rules tốt = Kết quả chính xác nhất!',\n },\n];\n\n/**\n * PromptsView - Guide for effective prompts\n */\nexport const PromptsView: React.FC<PromptsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={PROMPTS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface SkillsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst SKILLS_CONTENT = [\n {\n type: 'header' as const,\n text: '🛠 Skills - Mở rộng khả năng AI',\n },\n {\n type: 'section' as const,\n title: 'Skills là gì?',\n content: `Skills là \"kỹ năng\" chuyên biệt mà AI có thể học và sử dụng.\nMỗi skill là một gói hướng dẫn chi tiết cho một tác vụ cụ thể.\n\nKhác với Rules (context chung) và Workflows (quy trình):\n • Rules: \"Dự án dùng Laravel, naming convention như này...\"\n • Workflows: \"Để phát triển feature, làm theo các bước 1-2-3...\"\n • Skills: \"Để generate commit message, phân tích diff như này...\"`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Skill',\n content: `skills/\n└── skill-name/\n ├── SKILL.md # Main instruction file\n ├── scripts/ # Scripts hỗ trợ (optional)\n ├── references/ # Reference materials (optional)\n └── assets/ # Assets như templates (optional)\n\nSKILL.md format:\n---\nname: skill-name\ndescription: Mô tả ngắn\ntriggers: [patterns kích hoạt skill]\n---\n\n## Purpose\n## Steps\n## Examples`,\n },\n {\n type: 'section' as const,\n title: 'Skills có sẵn trong Jai1',\n content: `🎯 Development Skills:\n gen-commit-message Tạo commit message từ staged changes\n gen-prd Generate Product Requirements Document\n skill-creator Hướng dẫn tạo skill mới\n\n🖼 Media Skills:\n merge-mp4-files Merge video files với ffmpeg\n vid-scene-gen Generate video scene prompts\n\n📝 Documentation Skills:\n gen-frd Generate Functional Requirements Doc\n gen-tdd Generate Technical Design Doc`,\n },\n {\n type: 'section' as const,\n title: 'Cách sử dụng Skills',\n content: `1. Trigger bằng pattern:\n \"skill:gen-commit-message\"\n \"Dùng skill gen-commit-message để tạo message\"\n\n2. Kết hợp với Workflow:\n Workflows có thể gọi skills bên trong các phase\n\n3. Direct call trong chat:\n \"@skill/gen-commit-message\" (tùy IDE)`,\n },\n {\n type: 'section' as const,\n title: 'Tạo Skill mới',\n content: `Dùng workflow skill-creator:\n\n1. Xác định use case cụ thể\n2. Viết SKILL.md với format chuẩn\n3. Thêm scripts/references nếu cần\n4. Test với AI\n\nBest Practices:\n ✅ Skill nên focused vào 1 task\n ✅ Steps rõ ràng, actionable\n ✅ Có examples minh họa\n ❌ Không làm skill quá generic`,\n },\n {\n type: 'tip' as const,\n text: 'Skills giống như teaching AI một kỹ năng mới - càng chi tiết, AI càng làm tốt!',\n },\n];\n\n/**\n * SkillsView - Guide for Skills\n */\nexport const SkillsView: React.FC<SkillsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={SKILLS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport Spinner from 'ink-spinner';\n\ninterface AgenticGuideViewProps {\n onBack: () => void;\n}\n\ninterface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: Date;\n}\n\n// Suggested questions for quick access\nconst SUGGESTED_QUESTIONS = [\n 'Rules là gì?',\n 'Setup Jai1',\n 'Best practices workflows',\n 'Rules vs Skills',\n];\n\n// Mock responses\nconst MOCK_RESPONSES: Record<string, string> = {\n 'rules': `Rules là các file Markdown định nghĩa context cho AI.\nGiúp AI hiểu tech stack, conventions, architecture.\nVị trí: .cursor/rules/, .windsurf/rules/\nTip: Chạy \"jai1 apply rules/\" để cài rules mẫu!`,\n\n 'setup': `Setup Jai1:\n1. jai1 init\n2. jai1 apply (chọn components)\n3. jai1 vscode sync\n4. Tùy chỉnh .jai1/rules/ theo dự án`,\n\n 'workflows': `Best Practices Workflows:\n• Continuous execution (không dừng hỏi user)\n• Progress tracking với todo.md\n• Chia nhỏ thành phases rõ ràng\n• Quality gates ở mỗi phase`,\n\n 'skills': `Rules vs Skills:\n• Rules: Context chung, always active\n• Skills: Kỹ năng chuyên biệt, on-demand\nDùng cả hai: Rules cho context, Skills cho actions!`,\n\n 'default': `Tôi có thể trả lời về:\n• Rules - Quy tắc cho AI\n• Workflows - Quy trình làm việc\n• Skills - Kỹ năng mở rộng\n• Setup - Cài đặt Jai1\n\nThử hỏi: \"Rules là gì?\" hoặc \"Setup Jai1\"`,\n};\n\nfunction getMockResponse(message: string): string {\n const lower = message.toLowerCase();\n\n if (lower.includes('rule') || lower.includes('quy tắc')) {\n return MOCK_RESPONSES['rules']!;\n }\n if (lower.includes('setup') || lower.includes('init') || lower.includes('cài đặt')) {\n return MOCK_RESPONSES['setup']!;\n }\n if (lower.includes('workflow') || lower.includes('quy trình')) {\n return MOCK_RESPONSES['workflows']!;\n }\n if (lower.includes('skill') || lower.includes('khác')) {\n return MOCK_RESPONSES['skills']!;\n }\n\n return MOCK_RESPONSES['default']!;\n}\n\n/**\n * AgenticGuideView - Interactive Chat UI for AI Q&A\n */\nexport const AgenticGuideView: React.FC<AgenticGuideViewProps> = ({ onBack }) => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: 'welcome',\n role: 'system',\n content: 'Chào mừng đến Agentic Guide! Hỏi về Agentic Coding.',\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState('');\n const [isTyping, setIsTyping] = useState(false);\n const [selectedSuggestion, setSelectedSuggestion] = useState(0);\n const [focusArea, setFocusArea] = useState<'suggestions' | 'input'>('input');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape to go back\n if (key.escape) {\n onBack();\n return;\n }\n\n // Tab to switch focus\n if (key.tab) {\n setFocusArea(prev => prev === 'input' ? 'suggestions' : 'input');\n return;\n }\n\n // Handle suggestions navigation when focused\n if (focusArea === 'suggestions') {\n if (key.leftArrow) {\n setSelectedSuggestion(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedSuggestion(prev => Math.min(SUGGESTED_QUESTIONS.length - 1, prev + 1));\n } else if (key.return) {\n const question = SUGGESTED_QUESTIONS[selectedSuggestion];\n if (question) {\n handleSendMessage(question);\n setFocusArea('input');\n }\n }\n }\n });\n\n // Send message handler\n const handleSendMessage = async (text: string) => {\n if (!text.trim() || isTyping) return;\n\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInputValue('');\n setIsTyping(true);\n\n // Simulate AI thinking delay\n await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 700));\n\n const response = getMockResponse(text);\n\n const assistantMessage: ChatMessage = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response,\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, assistantMessage]);\n setIsTyping(false);\n };\n\n // Handle input submit\n const handleSubmit = (value: string) => {\n handleSendMessage(value);\n };\n\n // Render message content with proper line breaks\n const renderMessageContent = (content: string) => {\n const lines = content.split('\\n');\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n };\n\n // Get visible messages (last 4 to prevent overflow)\n const visibleMessages = messages.slice(-4);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color=\"magenta\">🤖 Agentic Guide</Text>\n <Text dimColor> - Hỏi đáp AI</Text>\n <Box flexGrow={1} />\n <Text backgroundColor=\"green\" color=\"black\" bold> BETA </Text>\n </Box>\n\n {/* Chat Messages Area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n minHeight={10}\n >\n {visibleMessages.map((msg) => (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={1}>\n {msg.role === 'user' ? (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>Bạn:</Text>\n <Box marginLeft={2}>\n <Text>{msg.content}</Text>\n </Box>\n </Box>\n ) : msg.role === 'assistant' ? (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>AI:</Text>\n <Box marginLeft={2}>\n {renderMessageContent(msg.content)}\n </Box>\n </Box>\n ) : (\n <Box>\n <Text dimColor italic>{msg.content}</Text>\n </Box>\n )}\n </Box>\n ))}\n\n {/* Typing indicator */}\n {isTyping && (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" /> AI đang trả lời...\n </Text>\n </Box>\n )}\n\n {/* Scroll hint */}\n {messages.length > 4 && (\n <Box justifyContent=\"center\">\n <Text dimColor>({messages.length - 4} tin nhắn trước)</Text>\n </Box>\n )}\n </Box>\n\n {/* Suggested Questions */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor bold>💡 Gợi ý:</Text>\n <Box marginTop={1}>\n {SUGGESTED_QUESTIONS.map((q, i) => {\n const isSelected = focusArea === 'suggestions' && i === selectedSuggestion;\n return (\n <Box key={i} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n {isSelected ? '❯' : ' '} {i + 1}. {q}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Input Box */}\n <Box\n borderStyle=\"round\"\n borderColor={focusArea === 'input' ? 'cyan' : 'gray'}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={focusArea === 'input' ? 'cyan' : 'gray'}>❯ </Text>\n {focusArea === 'input' ? (\n <TextInput\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder=\"Nhập câu hỏi...\"\n focus={true}\n />\n ) : (\n <Text dimColor>Nhấn Tab để nhập...</Text>\n )}\n </Box>\n\n {/* Help */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Chuyển · [Enter] Gửi/Chọn · [←→] Di chuyển gợi ý · [Esc] Quay lại\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Chat Command\n * Interactive chat with Jai1 LLM Proxy\n * Fullscreen terminal experience\n */\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ChatApp } from '../ui/llm/LlmApp.js';\nimport { ValidationError } from '../errors/index.js';\n\ninterface ChatCommandOptions {\n model?: string;\n}\n\n/**\n * Handle chat command\n */\nasync function handleChatCommand(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Render fullscreen app\n const { waitUntilExit, clear } = render(\n React.createElement(ChatApp, {\n service,\n initialModel: options.model,\n }),\n {\n // Enable fullscreen mode - clears terminal on exit\n exitOnCtrlC: false, // We handle exit via Esc\n }\n );\n\n await waitUntilExit();\n\n // Clear screen on exit for clean terminal\n clear();\n}\n\n/**\n * Create chat command\n */\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('Interactive AI chat with Jai1 LLM Proxy')\n .option('--model <model>', 'Initial model to use (e.g., gpt-4o, claude-3-opus)')\n .action(async (options: ChatCommandOptions) => {\n await handleChatCommand(options);\n });\n\n return cmd;\n}\n","/**\n * LLM Proxy Service\n * Client for interacting with Jai1 LLM proxy API\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport type {\n ModelsResponse,\n UserLimits,\n UsageStats,\n CompletionMessage,\n ChatCompletionChunk,\n ModelWithUsage,\n} from '../types/llm.types.js';\n\nexport class LlmProxyService {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: Jai1Config) {\n // Remove trailing slash if present\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.accessKey;\n }\n\n /**\n * Get the base URL for the LLM proxy (OpenAI-compatible endpoint)\n */\n getBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Fetch available models\n */\n async getModels(): Promise<ModelsResponse> {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Fetch user limits\n */\n async getLimits(): Promise<UserLimits> {\n const response = await fetch(`${this.baseUrl}/v1/me/limits`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch limits: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result?.data ?? { effectiveAllowedModels: [], effectiveRateLimits: {} };\n }\n\n /**\n * Fetch usage statistics\n */\n async getUsage(days = 7): Promise<UsageStats> {\n const response = await fetch(`${this.baseUrl}/v1/me/usage?days=${days}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch usage: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Get models with usage information\n */\n async getModelsWithUsage(): Promise<ModelWithUsage[]> {\n const [modelsRes, limits, usage] = await Promise.all([\n this.getModels(),\n this.getLimits(),\n this.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n const modelsData = modelsRes.data ?? [];\n\n return modelsData.map((model) => {\n const allowed = limits.effectiveAllowedModels?.includes(model.id) ?? false;\n const dailyLimit = limits.effectiveRateLimits?.[model.id] ?? limits.effectiveRateLimits?.[model.id.toLowerCase()];\n\n // Find usage record - try exact match first, then case-insensitive\n const usageData = usage.data ?? [];\n const usageRecord = usageData.find(\n (u) => u.model === model.id && u.date === today\n ) || usageData.find(\n (u) => u.model.toLowerCase() === model.id.toLowerCase() && u.date === today\n );\n const usedToday = usageRecord?.count || 0;\n\n return {\n ...model,\n allowed,\n dailyLimit,\n usedToday,\n };\n });\n }\n\n /**\n * Non-streaming chat completion (for translation and complete responses)\n * @returns Complete response content\n */\n async chat(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): Promise<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n const result = await response.json();\n return result.choices[0]?.message?.content || '';\n }\n\n /**\n * Stream chat completion\n * @yields Streamed text chunks\n */\n async *chatStream(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): AsyncGenerator<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed('Failed to parse SSE chunk:', e);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate sample cURL command\n */\n generateCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey.slice(0, 12)}...\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n\n /**\n * Generate full cURL command with actual API key\n */\n generateFullCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n}\n","/**\n * ChatApp - Main LLM Proxy Chat Application\n * Interactive TUI for chatting with LLM API\n * Simple layout to avoid re-render flickering\n */\nimport React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { LlmProxyService } from '../../services/llm-proxy.service.js';\nimport { useChat } from './hooks/useChat.js';\nimport { useLlmApi } from './hooks/useLlmApi.js';\nimport { ChatPanel } from './components/ChatPanel.js';\nimport { ModelSelector } from './components/ModelSelector.js';\nimport { SlashCommand } from './components/SlashCommandMenu.js';\n\n// Available slash commands - defined outside component to prevent recreation\nconst SLASH_COMMANDS: SlashCommand[] = [\n { name: 'model', description: 'Change the AI model', aliases: ['m'] },\n { name: 'stats', description: 'Show model usage statistics', aliases: ['s'] },\n { name: 'quit', description: 'Exit the chat', aliases: ['q', 'exit'] },\n];\n\ninterface ChatAppProps {\n service: LlmProxyService;\n initialModel?: string;\n}\n\ntype ViewType = 'loading' | 'chat' | 'model' | 'stats' | 'error';\n\nexport const ChatApp: React.FC<ChatAppProps> = ({ service, initialModel }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Capture terminal inner height once on mount (subtract header + footer = ~6 lines)\n const contentHeight = useRef(Math.max(10, (stdout?.rows || 24) - 6));\n\n // Core state\n const [currentView, setCurrentView] = useState<ViewType>('loading');\n const [showSlashMenu, setShowSlashMenu] = useState(false);\n const [slashMenuIndex, setSlashMenuIndex] = useState(0);\n const [inputValue, setInputValue] = useState('');\n const [selectedModel, setSelectedModel] = useState<string>('');\n\n // API data\n const { models, loading, error, refetch } = useLlmApi(service);\n\n // Chat state\n const { messages, isStreaming, sendMessage } = useChat(service);\n\n // Set initial model when loaded, or show error\n useEffect(() => {\n if (error && !loading) {\n setCurrentView('error');\n return;\n }\n if (models.length > 0 && !selectedModel) {\n const first = models.find((m) => m.allowed);\n if (first) {\n setSelectedModel(initialModel || first.id);\n setCurrentView('chat');\n }\n }\n }, [models, selectedModel, initialModel, error, loading]);\n\n // Filter commands based on input\n const filteredCommands = useMemo(() => {\n if (!inputValue.startsWith('/')) return SLASH_COMMANDS;\n const filter = inputValue.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (cmd) => cmd.name.includes(filter) || cmd.aliases?.some((a) => a.includes(filter))\n );\n }, [inputValue]);\n\n // Handlers\n const cycleModel = useCallback(() => {\n const allowed = models.filter((m) => m.allowed);\n if (allowed.length === 0) return;\n const idx = allowed.findIndex((m) => m.id === selectedModel);\n setSelectedModel(allowed[(idx + 1) % allowed.length]!.id);\n }, [models, selectedModel]);\n\n const execCommand = useCallback((cmd: string) => {\n const c = cmd.toLowerCase().replace(/^\\//, '');\n if (c === 'model' || c === 'm') { setCurrentView('model'); return true; }\n if (c === 'stats' || c === 's') { setCurrentView('stats'); refetch(); return true; }\n if (c === 'quit' || c === 'q' || c === 'exit') { exit(); return true; }\n return false;\n }, [refetch, exit]);\n\n // Keyboard input\n useInput((input, key) => {\n if (showSlashMenu) {\n if (key.upArrow) { setSlashMenuIndex((i) => Math.max(0, i - 1)); return; }\n if (key.downArrow) { setSlashMenuIndex((i) => Math.min(filteredCommands.length - 1, i + 1)); return; }\n if (key.return && filteredCommands[slashMenuIndex]) {\n setShowSlashMenu(false);\n execCommand(filteredCommands[slashMenuIndex].name);\n setInputValue('');\n return;\n }\n }\n if (key.escape) {\n if (showSlashMenu) { setShowSlashMenu(false); setInputValue(''); }\n else if (currentView !== 'chat' && currentView !== 'loading' && currentView !== 'error') { setCurrentView('chat'); }\n else { exit(); }\n return;\n }\n // Allow retry on error view with Enter or 'r'\n if (currentView === 'error' && (key.return || input === 'r')) {\n setCurrentView('loading');\n refetch();\n return;\n }\n if (key.tab && currentView === 'chat' && !showSlashMenu && !isStreaming) {\n cycleModel();\n }\n }, { isActive: true });\n\n const onInputChange = useCallback((v: string) => {\n setInputValue(v);\n const show = v.startsWith('/');\n setShowSlashMenu(show);\n if (show && v === '/') setSlashMenuIndex(0);\n }, []);\n\n const onSubmit = useCallback((v: string) => {\n const t = v.trim();\n setShowSlashMenu(false);\n if (t.startsWith('/') && execCommand(t)) { setInputValue(''); return; }\n if (t && !isStreaming && selectedModel) { sendMessage(t, selectedModel); setInputValue(''); }\n }, [execCommand, isStreaming, selectedModel, sendMessage]);\n\n const onSelectModel = useCallback((id: string) => {\n setSelectedModel(id);\n setCurrentView('chat');\n }, []);\n\n // Render stats\n const statsView = useMemo(() => {\n const allowed = models.filter((m) => m.allowed);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">📊 Model Usage Statistics</Text>\n {allowed.map((m) => {\n const limit = m.dailyLimit ?? 0;\n const used = m.usedToday ?? 0;\n const pct = limit > 0 ? Math.round((used / limit) * 100) : 0;\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return (\n <Box key={m.id} flexDirection=\"column\">\n <Text color={m.id === selectedModel ? 'yellow' : 'white'}>\n {m.id === selectedModel ? '► ' : ' '}{m.id}\n </Text>\n <Text color={pct > 80 ? 'red' : pct > 50 ? 'yellow' : 'green'}>\n {' '}{bar} <Text dimColor>{used}/{limit}</Text>\n </Text>\n </Box>\n );\n })}\n <Text dimColor>[Esc] Back</Text>\n </Box>\n );\n }, [models, selectedModel]);\n\n // Footer text\n const footer = currentView === 'error'\n ? '[Enter/r] Retry • [Esc] Quit'\n : currentView === 'model' || currentView === 'stats'\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Back'\n : showSlashMenu\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Cancel'\n : '[Tab] Next Model • [/] Commands • [Esc] Quit';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box borderStyle=\"double\" borderColor=\"magenta\" paddingX={1}>\n <Text bold color=\"magenta\">🤖 Jai1 Chat</Text>\n <Box flexGrow={1} />\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\" bold>{selectedModel || '...'}</Text>\n </Box>\n\n {/* Content */}\n {currentView === 'loading' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\">\n <Text><Spinner type=\"dots\" /> Loading...</Text>\n </Box>\n ) : currentView === 'error' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\" flexDirection=\"column\">\n <Text color=\"red\" bold>Connection Error</Text>\n <Text color=\"red\">{error}</Text>\n <Text dimColor> </Text>\n <Text dimColor>Press Enter or 'r' to retry</Text>\n </Box>\n ) : currentView === 'model' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n <ModelSelector\n models={models}\n currentModel={selectedModel}\n onSelect={onSelectModel}\n onCancel={() => setCurrentView('chat')}\n />\n </Box>\n ) : currentView === 'stats' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n {statsView}\n </Box>\n ) : (\n <ChatPanel\n messages={messages}\n isStreaming={isStreaming}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onSubmit={onSubmit}\n inputFocused={!showSlashMenu}\n showSlashMenu={showSlashMenu}\n slashCommands={filteredCommands}\n slashMenuIndex={slashMenuIndex}\n minHeight={contentHeight.current}\n />\n )}\n\n {/* Footer */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * useChat hook\n * Manages chat state and streaming responses\n */\nimport { useState, useCallback } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ChatMessage, CompletionMessage } from '../../../types/llm.types.js';\n\nexport function useChat(service: LlmProxyService) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendMessage = useCallback(\n async (content: string, model: string) => {\n if (!content.trim() || isStreaming) return;\n\n // Add user message\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant message placeholder\n const assistantMessageId = `assistant-${Date.now()}`;\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n try {\n // Convert chat messages to completion messages\n const completionMessages: CompletionMessage[] = [\n ...messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n {\n role: 'user' as const,\n content: content.trim(),\n },\n ];\n\n // Stream response\n let fullContent = '';\n for await (const chunk of service.chatStream(completionMessages, model)) {\n fullContent += chunk;\n\n // Update message content incrementally\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: fullContent }\n : msg\n )\n );\n }\n\n setIsStreaming(false);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n\n // Update last message with error\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: `Error: ${errorMessage}` }\n : msg\n )\n );\n\n setIsStreaming(false);\n }\n },\n [service, messages, isStreaming]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n clearMessages,\n };\n}\n","/**\n * useLlmApi hook\n * Manages LLM API data fetching and state\n * Only fetches once on mount - use refetch for manual updates\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ModelWithUsage, UserLimits, UsageStats } from '../../../types/llm.types.js';\n\ninterface LlmApiState {\n models: ModelWithUsage[];\n limits: UserLimits | null;\n usage: UsageStats | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useLlmApi(service: LlmProxyService) {\n const [state, setState] = useState<LlmApiState>({\n models: [],\n limits: null,\n usage: null,\n loading: true,\n error: null,\n });\n\n // Track if we've already fetched\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async (showLoading = false) => {\n // Show loading and clear error on fetch\n if (showLoading) {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n }\n\n try {\n const [models, limits, usage] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n service.getUsage(7),\n ]);\n\n setState({\n models,\n limits,\n usage,\n loading: false,\n error: null,\n });\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }));\n }\n }, [service]);\n\n // Only fetch once on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData(true);\n }\n }, []);\n\n // Refetch with loading state (for retry after error)\n const refetch = useCallback(() => {\n fetchData(true);\n }, [fetchData]);\n\n return {\n ...state,\n refetch,\n };\n}\n","/**\n * ChatPanel component\n * Simple, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { MessageItem } from './MessageItem.js';\nimport { InputBox } from './InputBox.js';\nimport { SlashCommand } from './SlashCommandMenu.js';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface ChatPanelProps {\n messages: ChatMessage[];\n isStreaming: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputFocused?: boolean;\n showSlashMenu?: boolean;\n slashCommands?: SlashCommand[];\n slashMenuIndex?: number;\n minHeight?: number;\n}\n\n// Memoized message list to prevent re-renders\nconst MessageList = memo(({ messages }: { messages: ChatMessage[] }) => {\n const visible = messages.slice(-8);\n const hidden = messages.length - visible.length;\n\n if (visible.length === 0) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={1}>\n <Text dimColor>Start a conversation...</Text>\n <Text dimColor>Type / for commands</Text>\n </Box>\n );\n }\n\n return (\n <>\n {hidden > 0 && <Text dimColor>({hidden} earlier)</Text>}\n {visible.map((m) => <MessageItem key={m.id} message={m} />)}\n </>\n );\n});\n\n// Memoized slash menu\nconst SlashMenu = memo(({ commands, index }: { commands: SlashCommand[]; index: number }) => (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">Commands</Text>\n {commands.map((cmd, i) => (\n <Text\n key={cmd.name}\n backgroundColor={i === index ? 'cyan' : undefined}\n color={i === index ? 'black' : 'white'}\n >\n {i === index ? '› ' : ' '}/{cmd.name} - {cmd.description}\n </Text>\n ))}\n </Box>\n));\n\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n messages,\n isStreaming,\n inputValue,\n onInputChange,\n onSubmit,\n inputFocused = true,\n showSlashMenu = false,\n slashCommands = [],\n slashMenuIndex = 0,\n minHeight = 15,\n}) => {\n // Subtract space for input box (~3 lines) and slash menu if shown (~5 lines)\n const messagesMinHeight = Math.max(5, minHeight - 4 - (showSlashMenu ? 5 : 0));\n\n return (\n <Box flexDirection=\"column\">\n {/* Messages */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} minHeight={messagesMinHeight}>\n <MessageList messages={messages} />\n {isStreaming && (\n <Text color=\"green\"><Spinner type=\"dots\" /> Responding...</Text>\n )}\n </Box>\n\n {/* Slash menu */}\n {showSlashMenu && slashCommands.length > 0 && (\n <SlashMenu commands={slashCommands} index={slashMenuIndex} />\n )}\n\n {/* Input */}\n <InputBox\n value={inputValue}\n onChange={onInputChange}\n onSubmit={onSubmit}\n disabled={isStreaming}\n focused={inputFocused}\n />\n </Box>\n );\n};\n","/**\n * MessageItem component\n * Memoized to prevent re-renders\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface MessageItemProps {\n message: ChatMessage;\n}\n\nexport const MessageItem = memo<MessageItemProps>(({ message }) => {\n if (message.role === 'user') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"cyan\" bold>You:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n if (message.role === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"green\" bold>Jai1:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>{message.content}</Text>\n </Box>\n );\n});\n","/**\n * InputBox component\n * Memoized, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface InputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n disabled?: boolean;\n focused?: boolean;\n}\n\nexport const InputBox = memo<InputBoxProps>(({\n value,\n onChange,\n onSubmit,\n disabled = false,\n focused = true,\n}) => (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">❯ </Text>\n {!disabled ? (\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder=\"Type your message...\"\n focus={focused}\n />\n ) : (\n <Text dimColor>Waiting...</Text>\n )}\n </Box>\n));\n","/**\n * ModelSelector component\n * Overlay for selecting LLM model\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelWithUsage } from '../../../types/llm.types.js';\n\ninterface ModelSelectorProps {\n models: ModelWithUsage[];\n currentModel: string;\n onSelect: (modelId: string) => void;\n onCancel: () => void;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n currentModel,\n onSelect,\n onCancel,\n}) => {\n const allowedModels = models.filter((m) => m.allowed);\n const currentIndex = allowedModels.findIndex((m) => m.id === currentModel);\n const [selectedIndex, setSelectedIndex] = useState(Math.max(0, currentIndex));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(allowedModels.length - 1, prev + 1));\n } else if (key.return) {\n const selected = allowedModels[selectedIndex];\n if (selected) {\n onSelect(selected.id);\n }\n }\n });\n\n if (allowedModels.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n padding={1}\n width={60}\n >\n <Text color=\"red\" bold>\n No models available\n </Text>\n <Text dimColor>Press Esc to close</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n width={70}\n >\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ Select Model\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n {allowedModels.map((model, i) => {\n const isSelected = i === selectedIndex;\n const isCurrent = model.id === currentModel;\n const icon = isSelected ? '●' : '○';\n\n let usageText = '';\n if (model.dailyLimit !== undefined && model.usedToday !== undefined) {\n usageText = ` (${model.usedToday}/${model.dailyLimit})`;\n }\n\n return (\n <Box key={model.id} marginY={0}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'white'}\n >\n {isSelected ? '❯ ' : ' '}\n {icon} {model.id}\n {isCurrent ? ' ✓' : ''}\n {usageText}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[↑↓] Navigate [Enter] Select [Esc] Cancel</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * OpenAI Keys Command\n * Show OpenAI-compatible API credentials and info\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 8) + '****' + key.slice(-4);\n}\n\n/**\n * Handle openai-keys command\n */\nasync function handleOpenAiKeysCommand(options: { full?: boolean }): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📡 Jai1 LLM Proxy - OpenAI Compatible API');\n console.log('─────────────────────────────────────────\\n');\n\n console.log('🔑 API Credentials');\n console.log(` BASE_URL: ${service.getBaseUrl()}`);\n console.log(` API_KEY: ${options.full ? service.getApiKey() : maskKey(service.getApiKey())}\\n`);\n\n try {\n const [models, limits] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n ]);\n\n const allowedModels = models.filter((m) => m.allowed);\n\n console.log('📦 Available Models');\n if (allowedModels.length === 0) {\n console.log(' No models available\\n');\n } else {\n allowedModels.forEach((model) => {\n const usageText =\n model.dailyLimit !== undefined && model.usedToday !== undefined\n ? ` (${model.usedToday}/${model.dailyLimit} today)`\n : '';\n console.log(` ✓ ${model.id}${usageText}`);\n });\n console.log();\n }\n\n const defaultModel = allowedModels[0]?.id || 'gpt-4o';\n console.log('📝 Sample cURL\\n');\n const curlSample = options.full\n ? service.generateFullCurlSample(defaultModel)\n : service.generateCurlSample(defaultModel);\n const curlLines = curlSample.split('\\n');\n curlLines.forEach((line) => console.log(` ${line}`));\n console.log();\n\n console.log('💡 Usage:');\n console.log(' - Use as drop-in replacement for OpenAI API');\n console.log(' - Compatible with: OpenAI SDK, LangChain, LlamaIndex, etc.');\n console.log(' - Run \"jai1 chat\" for interactive mode');\n console.log(' - Run \"jai1 openai-keys --full\" to show full API key');\n } catch (error) {\n console.error(\n '\\n❌ Failed to fetch API info:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Check your API URL and access key with \"jai1 status\"');\n }\n}\n\n/**\n * Create openai-keys command\n */\nexport function createOpenAiKeysCommand(): Command {\n const cmd = new Command('openai-keys')\n .description('Show OpenAI-compatible API credentials and info')\n .option('--full', 'Show full API key (unmasked)')\n .action(async (options: { full?: boolean }) => {\n await handleOpenAiKeysCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Stats Command\n * Show LLM usage statistics and limits\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport type { UsageRecord } from '../types/llm.types.js';\n\n/**\n * Handle stats command\n */\nasync function handleStatsCommand(): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Vui lòng chạy \"jai1 auth\" trước.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📊 Thống Kê Sử Dụng LLM');\n console.log('─────────────────────────────────────────\\n');\n\n try {\n // Fetch data in parallel\n const [limits, usage7Days, usageToday] = await Promise.all([\n service.getLimits(),\n service.getUsage(7),\n service.getUsage(1),\n ]);\n\n // Get today's date in GMT+7 timezone\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n\n console.log('📅 Khoảng thời gian: 7 ngày qua\\n');\n\n // Process usage data\n const usageByModel = new Map<string, { today: number; total7Days: number }>();\n\n // Calculate 7-day totals\n let total7DaysRequests = 0;\n usage7Days.data?.forEach((record: UsageRecord) => {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.total7Days += record.count;\n total7DaysRequests += record.count;\n });\n\n // Add today's usage\n usageToday.data?.forEach((record: UsageRecord) => {\n if (record.date === today) {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.today = record.count;\n }\n });\n\n // Display total summary\n console.log('📈 Tổng quan sử dụng');\n console.log(` Tổng số yêu cầu (7 ngày): ${total7DaysRequests}\\n`);\n\n // Display per-model table\n console.log('📦 Thống kê theo model\\n');\n console.log('┌─────────────────────────────────┬──────────────┬──────────────┬──────────────┐');\n console.log('│ Model │ Hôm nay │ Giới hạn │ Tổng 7 ngày │');\n console.log('├─────────────────────────────────┼──────────────┼──────────────┼──────────────┤');\n\n // Get all models from limits\n const allowedModels = limits.effectiveAllowedModels || [];\n const rateLimits = limits.effectiveRateLimits || {};\n\n if (allowedModels.length === 0) {\n console.log('│ Không có model nào khả dụng │');\n } else {\n allowedModels.forEach((modelId: string) => {\n const usage = usageByModel.get(modelId) || { today: 0, total7Days: 0 };\n const limit = rateLimits[modelId] || rateLimits[modelId.toLowerCase()] || 0;\n\n // Format columns with proper padding\n const modelCol = modelId.padEnd(31);\n const todayCol = `${usage.today}/${limit}`.padEnd(12);\n const limitCol = `${limit}/ngày`.padEnd(12);\n const totalCol = String(usage.total7Days).padEnd(12);\n\n console.log(`│ ${modelCol} │ ${todayCol} │ ${limitCol} │ ${totalCol} │`);\n });\n }\n\n console.log('└─────────────────────────────────┴──────────────┴──────────────┴──────────────┘');\n console.log('\\n💡 Mẹo: Chạy \"jai1 openai-keys\" để xem danh sách model khả dụng');\n } catch (error) {\n console.error(\n '\\n❌ Không thể lấy thống kê:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Kiểm tra kết nối API với \"jai1 status\"');\n }\n}\n\n/**\n * Create stats command\n */\nexport function createStatsCommand(): Command {\n const cmd = new Command('stats')\n .description('Hiển thị thống kê sử dụng LLM và giới hạn')\n .action(async () => {\n await handleStatsCommand();\n });\n\n return cmd;\n}\n","/**\n * Translate Command\n * Translate text, files, or folders using LLM Proxy\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { TranslationService } from '../services/translation.service.js';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\nimport type { TranslateOptions } from '../types/translate.types.js';\n\ninterface TranslateCommandOptions extends TranslateOptions {\n model?: string;\n}\n\n/**\n * Handle translate command\n */\nasync function handleTranslate(input: string, options: TranslateCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Chạy \"jai1 auth\" trước.');\n }\n\n const llmService = new LlmProxyService(config);\n const translationService = new TranslationService(llmService, options, options.model);\n\n // Detect input type\n const inputType = await translationService.detectInputType(input);\n\n // Handle based on type\n switch (inputType) {\n case 'text':\n await handleTextTranslation(translationService, input, options);\n break;\n case 'file':\n await handleFileTranslation(translationService, input, options);\n break;\n case 'folder':\n await handleFolderTranslation(translationService, input, options);\n break;\n }\n}\n\n/**\n * Handle text translation\n */\nasync function handleTextTranslation(\n service: TranslationService,\n text: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log('🌐 Đang dịch văn bản...');\n }\n\n const result = await service.translateText(text);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success && result.translatedContent) {\n console.log(`✅ Hoàn tất! Ngôn ngữ: ${result.targetLanguage}\\n`);\n console.log(result.translatedContent);\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle file translation\n */\nasync function handleFileTranslation(\n service: TranslationService,\n filePath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang dịch file: ${filePath}`);\n }\n\n const result = await service.translateFile(filePath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success) {\n if (options.dryRun) {\n console.log(`✅ Preview mode - sẽ lưu: ${result.outputPath}`);\n } else {\n console.log(`✅ Đã lưu: ${result.outputPath}`);\n }\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle folder translation\n */\nasync function handleFolderTranslation(\n service: TranslationService,\n folderPath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang quét thư mục: ${folderPath}\\n`);\n }\n\n const result = await service.translateFolder(folderPath, (progress) => {\n if (!options.json) {\n const fileName = progress.currentFile.split('/').pop() || progress.currentFile;\n process.stdout.write(\n `\\r🌐 Đang xử lý: ${progress.current}/${progress.total} - ${fileName}${' '.repeat(20)}`\n );\n }\n });\n\n if (!options.json) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(100) + '\\r');\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display summary\n console.log(`\\n✅ Hoàn tất! ${result.summary.success}/${result.summary.total} file đã dịch`);\n\n if (result.summary.failed > 0) {\n console.log(`\\n⚠️ ${result.summary.failed} file gặp lỗi:`);\n result.results\n .filter((r) => !r.success)\n .forEach((r) => {\n const fileName = r.inputPath.split('/').pop() || r.inputPath;\n console.log(` ❌ ${fileName}: ${r.error}`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n💡 Chạy không có --dry-run để lưu file.');\n }\n}\n\n/**\n * Create translate command\n */\nexport function createTranslateCommand(): Command {\n const cmd = new Command('translate')\n .description('Dịch văn bản, file hoặc thư mục bằng AI')\n .argument('<input>', 'Chuỗi văn bản, đường dẫn file hoặc thư mục')\n .option('--to <language>', 'Mã ngôn ngữ đích (mặc định: vi)', 'vi')\n .option('-o, --output <path>', 'Đường dẫn output (file/thư mục)')\n .option('--dry-run', 'Xem trước không lưu file')\n .option('--concurrency <number>', 'Số file xử lý song song (mặc định: 3)', '3')\n .option('--model <model>', 'Model LLM (mặc định: gpt-5.1-codex-mini)')\n .option('--json', 'Xuất kết quả dạng JSON')\n .action(async (input: string, options: TranslateCommandOptions) => {\n await handleTranslate(input, options);\n });\n\n return cmd;\n}\n","/**\n * Translation Service\n * Handles translation of text, files, and folders using LLM Proxy\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { LlmProxyService } from './llm-proxy.service.js';\nimport type { CompletionMessage } from '../types/llm.types.js';\nimport type {\n TranslateOptions,\n TranslationResult,\n FileTranslationResult,\n FolderTranslationResult,\n TranslationProgress,\n TRANSLATABLE_EXTENSIONS,\n TranslatableExtension,\n} from '../types/translate.types.js';\n\nconst TRANSLATABLE_EXTS = ['.md', '.txt', '.json', '.yaml', '.yml'] as const;\n\nexport class TranslationService {\n private readonly llmService: LlmProxyService;\n private readonly options: TranslateOptions;\n private readonly model: string;\n\n constructor(llmService: LlmProxyService, options: TranslateOptions, model?: string) {\n this.llmService = llmService;\n this.options = options;\n this.model = model || 'gpt-5.1-codex-mini'; // Default fast model for translation\n }\n\n /**\n * Detect input type\n */\n async detectInputType(input: string): Promise<'text' | 'file' | 'folder'> {\n try {\n const stat = await fs.stat(input);\n if (stat.isDirectory()) return 'folder';\n if (stat.isFile()) return 'file';\n } catch {\n // Path doesn't exist, treat as text\n }\n return 'text';\n }\n\n /**\n * Translate text string\n */\n async translateText(text: string): Promise<TranslationResult> {\n try {\n const translatedContent = await this.translateWithRetry(text, 'text');\n return {\n success: true,\n inputType: 'text',\n input: text,\n output: translatedContent,\n targetLanguage: this.options.to,\n translatedContent,\n };\n } catch (error) {\n return {\n success: false,\n inputType: 'text',\n input: text,\n output: '',\n targetLanguage: this.options.to,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate single file\n */\n async translateFile(filePath: string): Promise<FileTranslationResult> {\n try {\n // Read file content\n const content = await fs.readFile(filePath, 'utf-8');\n\n // Detect file type\n const ext = path.extname(filePath).toLowerCase();\n const fileType = this.getFileType(ext);\n\n // Translate content\n const translatedContent = await this.translateWithRetry(content, fileType);\n\n // Generate output path\n const outputPath = this.generateOutputPath(filePath);\n\n // Write output (unless dry-run)\n if (!this.options.dryRun) {\n await fs.writeFile(outputPath, translatedContent, 'utf-8');\n }\n\n return {\n inputPath: filePath,\n outputPath,\n success: true,\n };\n } catch (error) {\n return {\n inputPath: filePath,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate entire folder recursively\n */\n async translateFolder(\n folderPath: string,\n onProgress?: (progress: TranslationProgress) => void\n ): Promise<FolderTranslationResult> {\n const files = await this.discoverFiles(folderPath);\n const concurrency = parseInt(this.options.concurrency || '3', 10);\n const limit = pLimit(concurrency);\n\n const results: FileTranslationResult[] = [];\n let current = 0;\n\n const tasks = files.map((file) =>\n limit(async () => {\n current++;\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: 'translating',\n });\n\n const result = await this.translateFile(file);\n results.push(result);\n\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: result.success ? 'done' : 'error',\n });\n\n return result;\n })\n );\n\n await Promise.all(tasks);\n\n return this.summarizeResults(folderPath, results);\n }\n\n /**\n * Generate output path with language suffix\n */\n private generateOutputPath(inputPath: string): string {\n if (this.options.output) {\n return this.options.output;\n }\n\n const ext = path.extname(inputPath);\n const base = path.basename(inputPath, ext);\n const dir = path.dirname(inputPath);\n const lang = this.options.to;\n\n return path.join(dir, `${base}.${lang}${ext}`);\n }\n\n /**\n * Discover translatable files in folder recursively\n */\n private async discoverFiles(folderPath: string): Promise<string[]> {\n const entries = await fs.readdir(folderPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(folderPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subFiles = await this.discoverFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (TRANSLATABLE_EXTS.includes(ext as TranslatableExtension)) {\n // Skip already translated files (e.g., file.vi.md)\n if (!this.isTranslatedFile(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n return files;\n }\n\n /**\n * Check if filename indicates already translated file\n */\n private isTranslatedFile(filename: string): boolean {\n // Pattern: .{lang}.{ext} (e.g., .vi.md, .en.txt)\n const pattern = /\\.[a-z]{2}\\.(md|txt|json|ya?ml)$/i;\n return pattern.test(filename);\n }\n\n /**\n * Build translation prompt based on content type\n */\n private buildPrompt(content: string, fileType: string): CompletionMessage[] {\n const targetLang = this.options.to;\n let systemPrompt = '';\n\n switch (fileType) {\n case 'markdown':\n systemPrompt = `You are a professional translator.\nTranslate the following Markdown content to ${targetLang}.\nPreserve all formatting including:\n- Markdown syntax (headers, lists, code blocks, links, tables)\n- Line breaks and paragraph structure\n- Code snippets (do not translate code, only comments if present)\n- HTML tags if present\n\nReturn ONLY the translated content, no explanations.`;\n break;\n\n case 'json':\n systemPrompt = `You are translating a JSON localization file.\nTranslate all string values to ${targetLang}.\nPreserve the JSON structure and keys exactly.\nReturn valid JSON only, no explanations.`;\n break;\n\n case 'yaml':\n systemPrompt = `You are translating a YAML configuration file.\nTranslate all string values to ${targetLang}.\nPreserve the YAML structure and keys exactly.\nReturn valid YAML only, no explanations.`;\n break;\n\n default:\n systemPrompt = `You are a professional translator.\nTranslate the following text to ${targetLang}.\nPreserve all formatting and line breaks.\nReturn ONLY the translated content, no explanations.`;\n }\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: content },\n ];\n }\n\n /**\n * Get file type from extension\n */\n private getFileType(ext: string): string {\n switch (ext.toLowerCase()) {\n case '.md':\n return 'markdown';\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'text';\n }\n }\n\n /**\n * Translate with retry logic\n */\n private async translateWithRetry(content: string, fileType: string): Promise<string> {\n return pRetry(\n async () => {\n const messages = this.buildPrompt(content, fileType);\n const result = await this.llmService.chat(messages, this.model);\n return result;\n },\n {\n retries: 3,\n onFailedAttempt: (error) => {\n if (error.message.includes('rate limit')) {\n console.log('⚠️ Rate limit, đang thử lại...');\n }\n },\n }\n );\n }\n\n /**\n * Summarize folder translation results\n */\n private summarizeResults(\n folderPath: string,\n results: FileTranslationResult[]\n ): FolderTranslationResult {\n const summary = {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n skipped: 0,\n };\n\n return {\n inputFolder: folderPath,\n outputFolder: this.options.output || folderPath,\n results,\n summary,\n };\n }\n}\n","/**\n * Utils Command Group\n * Developer utilities for common tasks\n */\nimport { Command } from 'commander';\nimport { createPasswordCommand } from './password.js';\nimport { createUuidCommand } from './uuid.js';\nimport { createHashCommand } from './hash.js';\nimport { createBase64EncodeCommand } from './base64-encode.js';\nimport { createBase64DecodeCommand } from './base64-decode.js';\nimport { createHttpCommand } from './http.js';\nimport { createJwtCommand } from './jwt.js';\nimport { createUnixTimeCommand } from './unix-time.js';\nimport { createTimezoneCommand } from './timezone.js';\nimport { createUrlEncodeCommand } from './url-encode.js';\nimport { createUrlDecodeCommand } from './url-decode.js';\nimport { createCronCommand } from './cron.js';\nimport { createMarkdownPreviewCommand } from './markdown-preview.js';\nimport { runInteractiveMode } from './interactive.js';\n\n/**\n * Create utils command group\n * Subcommands:\n * - password: Generate secure passwords\n * - uuid: Generate UUID v4\n * - hash: Generate hash (MD5/SHA/bcrypt)\n * - base64-encode: Encode to Base64\n * - base64-decode: Decode from Base64\n * - http: Make HTTP requests\n * - jwt: Decode/encode JWT tokens\n * - unix-time: Convert unix timestamps\n * - timezone: Convert between timezones\n * - url-encode: Encode URL components\n * - url-decode: Decode URL components\n * - cron: Parse cron expressions\n * - markdown-preview: Preview markdown files\n */\nexport function createUtilsCommand(): Command {\n const utilsCommand = new Command('utils')\n .description('Developer utilities for common tasks')\n .option('-i, --interactive', 'Run in interactive mode')\n .addHelpText('after', `\nInteractive Mode:\n $ jai1 utils --interactive\n $ jai1 utils -i\n\nQuick Usage:\n $ jai1 utils password --length 24\n $ jai1 utils uuid --count 5\n $ jai1 utils hash \"text\" --algorithm sha256\n $ jai1 utils http https://api.example.com\n`);\n\n // Add all subcommands\n utilsCommand.addCommand(createPasswordCommand());\n utilsCommand.addCommand(createUuidCommand());\n utilsCommand.addCommand(createHashCommand());\n utilsCommand.addCommand(createBase64EncodeCommand());\n utilsCommand.addCommand(createBase64DecodeCommand());\n utilsCommand.addCommand(createHttpCommand());\n utilsCommand.addCommand(createJwtCommand());\n utilsCommand.addCommand(createUnixTimeCommand());\n utilsCommand.addCommand(createTimezoneCommand());\n utilsCommand.addCommand(createUrlEncodeCommand());\n utilsCommand.addCommand(createUrlDecodeCommand());\n utilsCommand.addCommand(createCronCommand());\n utilsCommand.addCommand(createMarkdownPreviewCommand());\n\n // Default action - interactive mode if no subcommand, otherwise show help\n utilsCommand.action(async (options) => {\n if (options.interactive) {\n await runInteractiveMode();\n } else {\n utilsCommand.help();\n }\n });\n\n return utilsCommand;\n}\n","/**\n * Password Generation Command\n * Generate secure random passwords\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handlePasswordGeneration(options: {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n count: number;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const passwords: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const password = service.generatePassword({\n length: options.length,\n lowercase: options.lowercase,\n uppercase: options.uppercase,\n digits: options.digits,\n symbols: options.symbols,\n symbolChars: options.symbolChars,\n });\n passwords.push(password);\n }\n\n console.log('🔐 Generated Password(s):');\n console.log('────────────────────────────────────────\\n');\n\n passwords.forEach((password, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${password}`);\n } else {\n console.log(` ${password}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createPasswordCommand(): Command {\n const cmd = new Command('password')\n .description('Generate secure random password')\n .option('-l, --length <number>', 'Password length', '16')\n .option('--no-lowercase', 'Exclude lowercase letters')\n .option('--no-uppercase', 'Exclude uppercase letters')\n .option('--no-digits', 'Exclude digits')\n .option('--no-symbols', 'Exclude symbols')\n .option('--symbol-chars <chars>', 'Custom symbol characters')\n .option('-c, --count <number>', 'Number of passwords to generate', '1')\n .addHelpText('after', `\nExamples:\n $ jai1 utils password\n $ jai1 utils password --length 24\n $ jai1 utils password --no-symbols\n $ jai1 utils password --count 5\n $ jai1 utils password -l 32 --no-digits\n`)\n .action(async (options) => {\n await handlePasswordGeneration({\n ...options,\n length: parseInt(options.length, 10),\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Utils Service\n * Core utility functions for developer tools\n */\nimport crypto from 'crypto';\nimport bcrypt from 'bcryptjs';\nimport { readFile } from 'fs/promises';\n\n// ============================================\n// TYPES\n// ============================================\n\nexport interface PasswordOptions {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n}\n\nexport interface UuidOptions {\n uppercase?: boolean;\n noHyphens?: boolean;\n}\n\nexport type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512' | 'bcrypt';\n\nexport interface HttpRequestOptions {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n followRedirects?: boolean;\n}\n\nexport interface HttpResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n size: number;\n}\n\n// ============================================\n// UTILS SERVICE\n// ============================================\n\nexport class UtilsService {\n /**\n * Generate secure random password\n */\n generatePassword(options: PasswordOptions): string {\n const {\n length,\n lowercase,\n uppercase,\n digits,\n symbols,\n symbolChars = '!@#$%^&*()_+-=[]{}|;:,.<>?'\n } = options;\n\n let charset = '';\n if (lowercase) charset += 'abcdefghijklmnopqrstuvwxyz';\n if (uppercase) charset += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (digits) charset += '0123456789';\n if (symbols) charset += symbolChars;\n\n if (charset.length === 0) {\n throw new Error('At least one character type must be enabled');\n }\n\n const randomBytes = crypto.randomBytes(length);\n let password = '';\n\n for (let i = 0; i < length; i++) {\n const randomIndex = randomBytes[i] % charset.length;\n password += charset[randomIndex];\n }\n\n return password;\n }\n\n /**\n * Generate UUID v4\n */\n generateUuid(options?: UuidOptions): string {\n let uuid = crypto.randomUUID();\n\n if (options?.uppercase) {\n uuid = uuid.toUpperCase();\n }\n\n if (options?.noHyphens) {\n uuid = uuid.replace(/-/g, '');\n }\n\n return uuid;\n }\n\n /**\n * Hash text or file using specified algorithm\n */\n async hash(input: string | Buffer, algorithm: HashAlgorithm): Promise<string> {\n if (algorithm === 'bcrypt') {\n throw new Error('Use hashBcrypt for bcrypt algorithm');\n }\n\n const hash = crypto.createHash(algorithm);\n hash.update(input);\n return hash.digest('hex');\n }\n\n /**\n * Hash file contents\n */\n async hashFile(filePath: string, algorithm: HashAlgorithm): Promise<string> {\n const content = await readFile(filePath);\n return this.hash(content, algorithm);\n }\n\n /**\n * Hash using bcrypt\n */\n async hashBcrypt(input: string, rounds: number = 10): Promise<string> {\n return bcrypt.hash(input, rounds);\n }\n\n /**\n * Base64 encode\n */\n base64Encode(input: string | Buffer, urlSafe: boolean = false): string {\n const buffer = typeof input === 'string' ? Buffer.from(input, 'utf-8') : input;\n let encoded = buffer.toString('base64');\n\n if (urlSafe) {\n encoded = encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n return encoded;\n }\n\n /**\n * Base64 decode\n */\n base64Decode(input: string): Buffer {\n // Handle URL-safe base64\n let normalized = input.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n while (normalized.length % 4) {\n normalized += '=';\n }\n\n return Buffer.from(normalized, 'base64');\n }\n\n /**\n * Make HTTP request with detailed output\n */\n async httpRequest(url: string, options: HttpRequestOptions): Promise<HttpResponse> {\n const startTime = performance.now();\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined,\n redirect: options.followRedirects === false ? 'manual' : 'follow',\n };\n\n const response = await fetch(url, fetchOptions);\n const body = await response.text();\n const endTime = performance.now();\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n timing: Math.round(endTime - startTime),\n size: Buffer.byteLength(body, 'utf-8'),\n };\n }\n\n /**\n * Decode JWT (no verification)\n */\n jwtDecode(token: string): { header: object; payload: object; signature: string } {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n const header = JSON.parse(this.base64Decode(headerB64).toString('utf-8'));\n const payload = JSON.parse(this.base64Decode(payloadB64).toString('utf-8'));\n\n return { header, payload, signature };\n }\n\n /**\n * Encode JWT (HS256 only)\n */\n jwtEncode(payload: object, secret: string, header?: object): string {\n const defaultHeader = { alg: 'HS256', typ: 'JWT' };\n const finalHeader = { ...defaultHeader, ...header };\n\n const headerB64 = this.base64Encode(JSON.stringify(finalHeader), true);\n const payloadB64 = this.base64Encode(JSON.stringify(payload), true);\n\n const signatureInput = `${headerB64}.${payloadB64}`;\n const signature = crypto\n .createHmac('sha256', secret)\n .update(signatureInput)\n .digest('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return `${headerB64}.${payloadB64}.${signature}`;\n }\n\n /**\n * Convert unix timestamp to date\n */\n unixToDate(timestamp: number, milliseconds: boolean = false): Date {\n return new Date(milliseconds ? timestamp : timestamp * 1000);\n }\n\n /**\n * Convert date to unix timestamp\n */\n dateToUnix(date: Date, milliseconds: boolean = false): number {\n const timestamp = date.getTime();\n return milliseconds ? timestamp : Math.floor(timestamp / 1000);\n }\n\n /**\n * Convert time between timezones\n */\n convertTimezone(\n time: Date | string,\n fromTimezone: string,\n toTimezone: string\n ): { time: string; iso: string } {\n const date = typeof time === 'string' ? new Date(time) : time;\n\n // Format in target timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: toTimezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(date);\n const dateParts = parts.reduce((acc, part) => {\n if (part.type !== 'literal') {\n acc[part.type] = part.value;\n }\n return acc;\n }, {} as Record<string, string>);\n\n const time24 = `${dateParts.year}-${dateParts.month}-${dateParts.day} ${dateParts.hour}:${dateParts.minute}:${dateParts.second}`;\n\n return {\n time: time24,\n iso: date.toISOString(),\n };\n }\n\n /**\n * Get list of available timezones\n */\n getTimezones(): string[] {\n // Common timezones\n return [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Sao_Paulo',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Europe/Moscow',\n 'Asia/Dubai',\n 'Asia/Kolkata',\n 'Asia/Bangkok',\n 'Asia/Shanghai',\n 'Asia/Tokyo',\n 'Asia/Seoul',\n 'Asia/Ho_Chi_Minh',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n ];\n }\n\n /**\n * URL encode\n */\n urlEncode(input: string, full: boolean = false): string {\n return full ? encodeURI(input) : encodeURIComponent(input);\n }\n\n /**\n * URL decode\n */\n urlDecode(input: string, full: boolean = false): string {\n return full ? decodeURI(input) : decodeURIComponent(input);\n }\n\n /**\n * Format bytes to human-readable size\n */\n formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;\n }\n}\n","/**\n * UUID Generation Command\n * Generate UUID v4 identifiers\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUuidGeneration(options: {\n count: number;\n uppercase: boolean;\n noHyphens: boolean;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const uuids: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const uuid = service.generateUuid({\n uppercase: options.uppercase,\n noHyphens: options.noHyphens,\n });\n uuids.push(uuid);\n }\n\n console.log('🆔 Generated UUID(s):');\n console.log('────────────────────────────────────────\\n');\n\n uuids.forEach((uuid, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${uuid}`);\n } else {\n console.log(` ${uuid}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUuidCommand(): Command {\n const cmd = new Command('uuid')\n .description('Generate UUID v4 identifier')\n .option('-c, --count <number>', 'Number of UUIDs to generate', '1')\n .option('--uppercase', 'Output in uppercase')\n .option('--no-hyphens', 'Remove hyphens from output')\n .addHelpText('after', `\nExamples:\n $ jai1 utils uuid\n $ jai1 utils uuid --count 10\n $ jai1 utils uuid --uppercase\n $ jai1 utils uuid --no-hyphens\n $ jai1 utils uuid --uppercase --no-hyphens\n`)\n .action(async (options) => {\n await handleUuidGeneration({\n ...options,\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Hash Generation Command\n * Generate hash using MD5, SHA, or bcrypt\n */\nimport { Command } from 'commander';\nimport { UtilsService, HashAlgorithm } from '../../services/utils.service.js';\n\nasync function handleHashGeneration(\n input: string | undefined,\n options: {\n algorithm: HashAlgorithm;\n file?: string;\n rounds: number;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let hash: string;\n\n if (options.file) {\n // Hash file contents\n if (options.algorithm === 'bcrypt') {\n console.error('❌ bcrypt cannot be used with files (it requires string input)');\n process.exit(1);\n }\n hash = await service.hashFile(options.file, options.algorithm);\n } else {\n // Hash text input\n if (!input) {\n console.error('❌ Please provide input text or use --file option');\n process.exit(1);\n }\n\n if (options.algorithm === 'bcrypt') {\n hash = await service.hashBcrypt(input, options.rounds);\n } else {\n hash = await service.hash(input, options.algorithm);\n }\n }\n\n console.log('🔒 Hash Result:');\n console.log('────────────────────────────────────────');\n console.log(` Algorithm: ${options.algorithm.toUpperCase()}`);\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.algorithm === 'bcrypt') {\n console.log(` Rounds: ${options.rounds}`);\n }\n console.log();\n console.log(` ${hash}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHashCommand(): Command {\n const cmd = new Command('hash')\n .description('Generate hash (MD5, SHA, bcrypt)')\n .argument('[input]', 'Text to hash')\n .option(\n '-a, --algorithm <algorithm>',\n 'Hash algorithm (md5, sha1, sha256, sha512, bcrypt)',\n 'sha256'\n )\n .option('-f, --file <path>', 'Hash file contents instead of text')\n .option('-r, --rounds <number>', 'Bcrypt rounds (only for bcrypt)', '10')\n .addHelpText('after', `\nExamples:\n $ jai1 utils hash \"hello world\"\n $ jai1 utils hash \"hello\" --algorithm md5\n $ jai1 utils hash \"password\" --algorithm bcrypt\n $ jai1 utils hash \"password\" --algorithm bcrypt --rounds 12\n $ jai1 utils hash --file ./myfile.txt\n $ jai1 utils hash --file ./image.png --algorithm sha512\n`)\n .action(async (input, options) => {\n await handleHashGeneration(input, {\n ...options,\n rounds: parseInt(options.rounds, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Base64 Encode Command\n * Encode text or files to Base64\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Encode(\n input: string | undefined,\n options: {\n file?: string;\n urlSafe: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encoded: string;\n\n if (options.file) {\n const content = await readFile(options.file);\n encoded = service.base64Encode(content, options.urlSafe);\n } else {\n if (!input) {\n console.error('❌ Please provide input text or use --file option');\n process.exit(1);\n }\n encoded = service.base64Encode(input, options.urlSafe);\n }\n\n console.log('📝 Base64 Encoded:');\n console.log('────────────────────────────────────────');\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.urlSafe) {\n console.log(` Format: URL-safe`);\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64EncodeCommand(): Command {\n const cmd = new Command('base64-encode')\n .description('Encode text or file to Base64')\n .argument('[input]', 'Text to encode')\n .option('-f, --file <path>', 'Encode file contents')\n .option('--url-safe', 'Use URL-safe Base64 encoding')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-encode \"hello world\"\n $ jai1 utils base64-encode \"hello world\" --url-safe\n $ jai1 utils base64-encode --file ./document.txt\n $ jai1 utils base64-encode --file ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Encode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Base64 Decode Command\n * Decode Base64 strings\n */\nimport { Command } from 'commander';\nimport { readFile, writeFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Decode(\n input: string | undefined,\n options: {\n file?: string;\n output?: string;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encodedInput: string;\n\n if (options.file) {\n encodedInput = await readFile(options.file, 'utf-8');\n } else {\n if (!input) {\n console.error('❌ Please provide Base64 input or use --file option');\n process.exit(1);\n }\n encodedInput = input;\n }\n\n const decoded = service.base64Decode(encodedInput.trim());\n\n if (options.output) {\n await writeFile(options.output, decoded);\n console.log('✅ Decoded and saved to:', options.output);\n } else {\n console.log('📝 Base64 Decoded:');\n console.log('────────────────────────────────────────');\n console.log();\n console.log(` ${decoded.toString('utf-8')}`);\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64DecodeCommand(): Command {\n const cmd = new Command('base64-decode')\n .description('Decode Base64 string')\n .argument('[input]', 'Base64 string to decode')\n .option('-f, --file <path>', 'Decode from file')\n .option('-o, --output <path>', 'Write decoded output to file')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-decode \"aGVsbG8gd29ybGQ=\"\n $ jai1 utils base64-decode --file ./encoded.txt\n $ jai1 utils base64-decode \"aGVsbG8=\" --output ./decoded.txt\n $ jai1 utils base64-decode --file ./encoded.txt --output ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Decode(input, options);\n });\n\n return cmd;\n}\n","/**\n * HTTP Request Command\n * Make HTTP requests with detailed output\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleHttpRequest(\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n file?: string;\n timeout: number;\n noFollow: boolean;\n onlyHeaders: boolean;\n onlyBody: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n // Parse headers\n const headers: Record<string, string> = {};\n if (options.header) {\n options.header.forEach((header) => {\n const [key, ...valueParts] = header.split(':');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(':').trim();\n }\n });\n }\n\n // Get body\n let body: string | undefined;\n if (options.file) {\n body = await readFile(options.file, 'utf-8');\n } else if (options.data) {\n body = options.data;\n }\n\n // Make request\n const response = await service.httpRequest(url, {\n method: options.method.toUpperCase(),\n headers,\n body,\n timeout: options.timeout,\n followRedirects: !options.noFollow,\n });\n\n // Display results\n if (!options.onlyBody) {\n console.log(`HTTP/${response.status >= 200 && response.status < 300 ? '1.1' : '1.0'} ${response.status} ${response.statusText}`);\n console.log('───────────────────────────────────────────');\n console.log(`📊 Status: ${response.status} ${response.statusText}`);\n console.log(`⏱️ Time: ${response.timing}ms`);\n console.log(`📦 Size: ${service.formatBytes(response.size)}`);\n console.log();\n }\n\n if (!options.onlyBody && !options.onlyHeaders) {\n console.log('📋 Headers:');\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(` ${key}: ${value}`);\n });\n console.log();\n }\n\n if (options.onlyHeaders) {\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(`${key}: ${value}`);\n });\n return;\n }\n\n if (!options.onlyHeaders) {\n if (!options.onlyBody) {\n console.log('📄 Body:');\n }\n\n // Try to format as JSON\n try {\n const json = JSON.parse(response.body);\n console.log(JSON.stringify(json, null, 2));\n } catch {\n console.log(response.body);\n }\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHttpCommand(): Command {\n const cmd = new Command('http')\n .description('Make HTTP request with formatted output')\n .argument('<url>', 'Target URL')\n .option('-X, --method <method>', 'HTTP method', 'GET')\n .option('-H, --header <header...>', 'Request headers (repeatable)')\n .option('-d, --data <data>', 'Request body (JSON string)')\n .option('--file <path>', 'Read body from file')\n .option('--timeout <ms>', 'Request timeout in milliseconds', '30000')\n .option('--no-follow', 'Do not follow redirects')\n .option('--only-headers', 'Show only response headers')\n .option('--only-body', 'Show only response body')\n .addHelpText('after', `\nExamples:\n $ jai1 utils http https://api.example.com/users\n $ jai1 utils http https://api.example.com/users -X POST -d '{\"name\":\"John\"}'\n $ jai1 utils http https://api.example.com -H \"Authorization: Bearer token123\"\n $ jai1 utils http https://api.example.com -H \"Content-Type: application/json\" -H \"Accept: application/json\"\n $ jai1 utils http https://api.example.com --timeout 5000\n $ jai1 utils http https://api.example.com --only-body\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (url, options) => {\n await handleHttpRequest(url, {\n ...options,\n timeout: parseInt(options.timeout, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * JWT Command\n * Decode and encode JWT tokens\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleJwtDecode(token: string): Promise<void> {\n const service = new UtilsService();\n\n try {\n const { header, payload, signature } = service.jwtDecode(token);\n\n console.log('🔓 JWT Decoded:');\n console.log('────────────────────────────────────────\\n');\n\n console.log('📋 Header:');\n console.log(JSON.stringify(header, null, 2));\n console.log();\n\n console.log('📄 Payload:');\n console.log(JSON.stringify(payload, null, 2));\n console.log();\n\n console.log('🔏 Signature:');\n console.log(` ${signature}`);\n console.log();\n\n console.log('⚠️ Note: Token signature is not verified');\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nasync function handleJwtEncode(options: {\n payload: string;\n secret: string;\n header?: string;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const payload = JSON.parse(options.payload);\n const header = options.header ? JSON.parse(options.header) : undefined;\n\n const token = service.jwtEncode(payload, options.secret, header);\n\n console.log('🔐 JWT Encoded:');\n console.log('────────────────────────────────────────\\n');\n console.log(` ${token}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createJwtCommand(): Command {\n const jwtCommand = new Command('jwt')\n .description('Decode and encode JWT tokens');\n\n // Decode subcommand\n jwtCommand\n .command('decode')\n .description('Decode JWT token')\n .argument('<token>', 'JWT token to decode')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt decode \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n $ jai1 utils jwt decode $JWT_TOKEN\n`)\n .action(async (token) => {\n await handleJwtDecode(token);\n });\n\n // Encode subcommand\n const encodeCommand = jwtCommand\n .command('encode')\n .description('Encode JWT token (HS256)')\n .requiredOption('-p, --payload <json>', 'Payload as JSON string')\n .requiredOption('-s, --secret <secret>', 'Secret key for signing')\n .option('-h, --header <json>', 'Custom header as JSON string')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt encode --payload '{\"sub\":\"123\",\"name\":\"John\"}' --secret \"mysecret\"\n $ jai1 utils jwt encode -p '{\"userId\":\"456\"}' -s \"key123\"\n $ jai1 utils jwt encode -p '{\"sub\":\"789\"}' -s \"secret\" -h '{\"alg\":\"HS256\",\"typ\":\"JWT\"}'\n`)\n .action(async (options) => {\n await handleJwtEncode(options);\n });\n\n // Show help on error for missing required options\n encodeCommand.showHelpAfterError('(add --help for additional examples)');\n\n return jwtCommand;\n}\n","/**\n * Unix Time Command\n * Convert unix timestamps to/from human-readable dates\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUnixTime(\n input: string | undefined,\n options: {\n format: 'iso' | 'local' | 'utc';\n ms: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (!input) {\n // Show current timestamp\n const now = new Date();\n const timestamp = service.dateToUnix(now, options.ms);\n\n console.log('🕒 Current Unix Timestamp:');\n console.log('────────────────────────────────────────');\n console.log(` ${timestamp}${options.ms ? ' (milliseconds)' : ''}`);\n console.log();\n console.log(` ISO: ${now.toISOString()}`);\n console.log(` Local: ${now.toLocaleString()}`);\n console.log();\n } else if (/^\\d+$/.test(input)) {\n // Convert unix timestamp to date\n const timestamp = parseInt(input, 10);\n const date = service.unixToDate(timestamp, options.ms);\n\n console.log('🕒 Unix Timestamp to Date:');\n console.log('────────────────────────────────────────');\n console.log(` Input: ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n\n if (options.format === 'iso' || options.format === 'utc') {\n console.log(` ${date.toISOString()}`);\n } else {\n console.log(` ${date.toLocaleString()}`);\n }\n console.log();\n } else {\n // Convert date string to unix timestamp\n const date = new Date(input);\n\n if (isNaN(date.getTime())) {\n console.error('❌ Invalid date format');\n process.exit(1);\n }\n\n const timestamp = service.dateToUnix(date, options.ms);\n\n console.log('🕒 Date to Unix Timestamp:');\n console.log('────────────────────────────────────────');\n console.log(` Input: ${input}`);\n console.log(` Parsed: ${date.toISOString()}`);\n console.log();\n console.log(` ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUnixTimeCommand(): Command {\n const cmd = new Command('unix-time')\n .description('Convert unix timestamps to/from dates')\n .argument('[input]', 'Unix timestamp or date string')\n .option('-f, --format <format>', 'Output format (iso, local, utc)', 'iso')\n .option('--ms', 'Use milliseconds instead of seconds')\n .addHelpText('after', `\nExamples:\n $ jai1 utils unix-time\n $ jai1 utils unix-time 1702550400\n $ jai1 utils unix-time 1702550400000 --ms\n $ jai1 utils unix-time \"2024-01-15 10:30:00\"\n $ jai1 utils unix-time \"2024-01-15\" --format local\n $ jai1 utils unix-time --ms\n`)\n .action(async (input, options) => {\n await handleUnixTime(input, options);\n });\n\n return cmd;\n}\n","/**\n * Timezone Command\n * Convert time between timezones\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleTimezoneConversion(\n time: string | undefined,\n options: {\n from: string;\n to: string;\n list: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (options.list) {\n console.log('🌍 Available Timezones:');\n console.log('────────────────────────────────────────\\n');\n\n const timezones = service.getTimezones();\n timezones.forEach((tz) => {\n console.log(` ${tz}`);\n });\n console.log();\n return;\n }\n\n if (!time) {\n console.error('❌ Please provide time to convert or use --list to see available timezones');\n process.exit(1);\n }\n\n if (!options.from || !options.to) {\n console.error('❌ Please provide both --from and --to timezones');\n process.exit(1);\n }\n\n const result = service.convertTimezone(time, options.from, options.to);\n\n console.log('🌍 Timezone Conversion:');\n console.log('────────────────────────────────────────');\n console.log(` From: ${options.from}`);\n console.log(` To: ${options.to}`);\n console.log();\n console.log(` ${result.time}`);\n console.log(` ISO: ${result.iso}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createTimezoneCommand(): Command {\n const cmd = new Command('timezone')\n .description('Convert time between timezones')\n .argument('[time]', 'Time to convert (e.g., \"2024-01-15 10:00\")')\n .option('--from <timezone>', 'Source timezone')\n .option('--to <timezone>', 'Target timezone')\n .option('--list', 'Show available timezones')\n .addHelpText('after', `\nExamples:\n $ jai1 utils timezone --list\n $ jai1 utils timezone \"2024-01-15 10:00\" --from \"America/New_York\" --to \"Asia/Tokyo\"\n $ jai1 utils timezone \"2024-01-15 14:30\" --from \"UTC\" --to \"America/Los_Angeles\"\n $ jai1 utils timezone \"2024-12-25 12:00\" --from \"Europe/London\" --to \"Asia/Ho_Chi_Minh\"\n`)\n .action(async (time, options) => {\n await handleTimezoneConversion(time, options);\n });\n\n return cmd;\n}\n","/**\n * URL Encode Command\n * Encode URL components or full URLs\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlEncode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const encoded = service.urlEncode(input, options.full);\n\n console.log('🔗 URL Encoded:');\n console.log('────────────────────────────────────────');\n if (options.full) {\n console.log(' Mode: Full URL (encodeURI)');\n } else {\n console.log(' Mode: Component (encodeURIComponent)');\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlEncodeCommand(): Command {\n const cmd = new Command('url-encode')\n .description('Encode URL component or full URL')\n .argument('<input>', 'Text to encode')\n .option('--full', 'Encode full URL (use encodeURI instead of encodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-encode \"hello world\"\n $ jai1 utils url-encode \"hello world & test\"\n $ jai1 utils url-encode \"name=John Doe&age=30\"\n $ jai1 utils url-encode \"https://example.com/path with spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlEncode(input, options);\n });\n\n return cmd;\n}\n","/**\n * URL Decode Command\n * Decode URL-encoded strings\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlDecode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const decoded = service.urlDecode(input, options.full);\n\n console.log('🔗 URL Decoded:');\n console.log('────────────────────────────────────────');\n if (options.full) {\n console.log(' Mode: Full URL (decodeURI)');\n } else {\n console.log(' Mode: Component (decodeURIComponent)');\n }\n console.log();\n console.log(` ${decoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlDecodeCommand(): Command {\n const cmd = new Command('url-decode')\n .description('Decode URL-encoded string')\n .argument('<input>', 'Text to decode')\n .option('--full', 'Decode full URL (use decodeURI instead of decodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-decode \"hello%20world\"\n $ jai1 utils url-decode \"hello%20world%20%26%20test\"\n $ jai1 utils url-decode \"name%3DJohn%20Doe%26age%3D30\"\n $ jai1 utils url-decode \"https://example.com/path%20with%20spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlDecode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Cron Parser Command\n * Parse and explain cron expressions\n */\nimport { Command } from 'commander';\nimport cronstrue from 'cronstrue';\n\nasync function handleCronParse(expression: string): Promise<void> {\n try {\n // Parse cron expression to human-readable\n const description = cronstrue.toString(expression);\n\n console.log('⏰ Cron Expression Parser:');\n console.log('────────────────────────────────────────');\n console.log(` Expression: ${expression}`);\n console.log(` Meaning: ${description}`);\n console.log();\n\n // Calculate next 5 execution times\n console.log('📅 Next 5 Executions:');\n\n const parts = expression.trim().split(/\\s+/);\n if (parts.length < 5 || parts.length > 6) {\n console.log(' ⚠️ Invalid cron expression format');\n return;\n }\n\n // Simple calculation for next runs (approximate)\n const now = new Date();\n const executions: string[] = [];\n\n for (let i = 0; i < 5; i++) {\n const nextTime = new Date(now);\n nextTime.setDate(nextTime.getDate() + i);\n\n // Try to match hour and minute from cron\n const [minute, hour] = parts.slice(parts.length === 6 ? 1 : 0, parts.length === 6 ? 3 : 2);\n\n if (minute !== '*' && !minute.includes('/') && !minute.includes('-')) {\n nextTime.setMinutes(parseInt(minute, 10));\n }\n\n if (hour !== '*' && !hour.includes('/') && !hour.includes('-')) {\n nextTime.setHours(parseInt(hour, 10));\n }\n\n executions.push(\n ` ${i + 1}. ${nextTime.toISOString().replace('T', ' ').substring(0, 19)}`\n );\n }\n\n executions.forEach((exec) => console.log(exec));\n console.log();\n\n console.log('💡 Tip: This is an approximate calculation.');\n console.log(' For exact times, consider your system timezone.');\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createCronCommand(): Command {\n const cmd = new Command('cron')\n .description('Parse and explain cron expression')\n .argument('<expression>', 'Cron expression (e.g., \"0 5 * * *\")')\n .addHelpText('after', `\nExamples:\n $ jai1 utils cron \"0 5 * * *\"\n $ jai1 utils cron \"*/15 * * * *\"\n $ jai1 utils cron \"0 0 1 * *\"\n $ jai1 utils cron \"0 9-17 * * 1-5\"\n $ jai1 utils cron \"30 2 * * 0\"\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (expression) => {\n await handleCronParse(expression);\n });\n\n return cmd;\n}\n","/**\n * Markdown Preview Command\n * Preview markdown files in terminal\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { marked } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\n\nasync function handleMarkdownPreview(\n file: string,\n options: {\n raw: boolean;\n }\n): Promise<void> {\n try {\n let content = await readFile(file, 'utf-8');\n\n if (options.raw) {\n // Show raw markdown with basic formatting\n console.log('📄 Markdown File (Raw):');\n console.log('────────────────────────────────────────\\n');\n console.log(content);\n console.log();\n } else {\n // Pre-process content to replace Mermaid blocks with placeholders\n content = content.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n🎨 **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n💡 *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Render markdown in terminal\n marked.setOptions({\n // @ts-ignore - marked-terminal types may not match perfectly\n renderer: new TerminalRenderer(),\n });\n\n const rendered = marked(content);\n\n console.log('📄 Markdown Preview:');\n console.log('────────────────────────────────────────\\n');\n console.log(rendered);\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createMarkdownPreviewCommand(): Command {\n const cmd = new Command('markdown-preview')\n .description('Preview markdown file in terminal')\n .argument('<file>', 'Markdown file path')\n .option('--raw', 'Show raw markdown instead of rendered')\n .addHelpText('after', `\nExamples:\n $ jai1 utils markdown-preview README.md\n $ jai1 utils markdown-preview ./docs/guide.md\n $ jai1 utils markdown-preview CHANGELOG.md --raw\n $ jai1 utils markdown-preview ./notes.md\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (file, options) => {\n await handleMarkdownPreview(file, options);\n });\n\n return cmd;\n}\n","/**\n * Interactive Utils Mode\n * Launch the professional Ink-based TUI\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { UtilsApp } from '../../ui/utils/UtilsApp.js';\n\nexport async function runInteractiveMode(): Promise<void> {\n return new Promise((resolve) => {\n const { unmount, waitUntilExit } = render(\n React.createElement(UtilsApp, {\n onExit: () => {\n unmount();\n resolve();\n },\n })\n );\n\n // Wait for the app to exit\n waitUntilExit().then(() => {\n resolve();\n });\n });\n}\n","/**\n * Utils TUI App\n * Professional TUI interface with left sidebar menu\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { PasswordView } from './views/PasswordView.js';\nimport { UuidView } from './views/UuidView.js';\nimport { HashView } from './views/HashView.js';\nimport { Base64View } from './views/Base64View.js';\nimport { UrlView } from './views/UrlView.js';\nimport { UnixTimeView } from './views/UnixTimeView.js';\nimport { JwtView } from './views/JwtView.js';\nimport { CronView } from './views/CronView.js';\nimport { TimezoneView } from './views/TimezoneView.js';\nimport { HttpView } from './views/HttpView.js';\nimport { MarkdownView } from './views/MarkdownView.js';\n\nexport type UtilityType =\n | 'password'\n | 'uuid'\n | 'hash'\n | 'base64-encode'\n | 'base64-decode'\n | 'http'\n | 'jwt'\n | 'unix-time'\n | 'timezone'\n | 'url-encode'\n | 'url-decode'\n | 'cron'\n | 'markdown';\n\ninterface MenuItem {\n id: UtilityType;\n icon: string;\n label: string;\n description: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n { id: 'password', icon: '🔐', label: 'Password', description: 'Generate secure passwords' },\n { id: 'uuid', icon: '🆔', label: 'UUID', description: 'Generate UUID v4' },\n { id: 'hash', icon: '🔒', label: 'Hash', description: 'Hash with MD5/SHA/bcrypt' },\n { id: 'base64-encode', icon: '📝', label: 'Base64 Encode', description: 'Encode to Base64' },\n { id: 'base64-decode', icon: '📝', label: 'Base64 Decode', description: 'Decode Base64' },\n { id: 'http', icon: '🌐', label: 'HTTP Request', description: 'Make HTTP requests' },\n { id: 'jwt', icon: '🔑', label: 'JWT', description: 'Decode/encode JWT' },\n { id: 'unix-time', icon: '🕒', label: 'Unix Time', description: 'Convert timestamps' },\n { id: 'timezone', icon: '🌍', label: 'Timezone', description: 'Convert timezones' },\n { id: 'url-encode', icon: '🔗', label: 'URL Encode', description: 'Encode URLs' },\n { id: 'url-decode', icon: '🔗', label: 'URL Decode', description: 'Decode URLs' },\n { id: 'cron', icon: '⏰', label: 'Cron Parser', description: 'Parse cron expressions' },\n { id: 'markdown', icon: '📄', label: 'Markdown', description: 'Preview markdown' },\n];\n\ninterface UtilsAppProps {\n onExit: () => void;\n}\n\nexport const UtilsApp: React.FC<UtilsAppProps> = ({ onExit }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [activeView, setActiveView] = useState<UtilityType | null>(null);\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (activeView) {\n // If in a view, Escape goes back to menu\n if (key.escape) {\n setActiveView(null);\n }\n return;\n }\n\n // Main menu navigation\n if (key.upArrow || input === 'k') {\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : MENU_ITEMS.length - 1));\n } else if (key.downArrow || input === 'j') {\n setSelectedIndex((prev) => (prev < MENU_ITEMS.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n setActiveView(MENU_ITEMS[selectedIndex].id);\n } else if (input === 'q' || key.escape) {\n onExit();\n exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={2}\n paddingY={0}\n marginBottom={1}\n >\n <Text bold color=\"cyan\">\n 🛠️ Developer Utilities - Interactive Mode\n </Text>\n <Box marginLeft=\"auto\">\n <Text dimColor>Press 'q' to quit</Text>\n </Box>\n </Box>\n\n {/* Main Content Area */}\n <Box flexGrow={1}>\n {/* Left Sidebar - Menu */}\n <Box\n flexDirection=\"column\"\n width={30}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={1}\n marginRight={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"yellow\">\n Select Utility:\n </Text>\n </Box>\n\n {MENU_ITEMS.map((item, index) => (\n <Box key={item.id} marginBottom={0}>\n <Text\n color={selectedIndex === index && !activeView ? 'green' : undefined}\n bold={selectedIndex === index && !activeView}\n dimColor={activeView !== null && activeView !== item.id}\n >\n {selectedIndex === index && !activeView ? '▶ ' : ' '}\n {item.icon} {item.label}\n </Text>\n </Box>\n ))}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n ↑/↓: Navigate{'\\n'}\n Enter: Select{'\\n'}\n Esc: Back/Quit\n </Text>\n </Box>\n </Box>\n\n {/* Right Content Area */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n >\n {activeView ? (\n <ActiveUtilityView utilityType={activeView} />\n ) : (\n <WelcomeView selectedItem={MENU_ITEMS[selectedIndex]} />\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n marginTop={1}\n >\n <Text dimColor>\n jai1-cli | Use arrow keys or j/k to navigate\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Welcome view shown when no utility is selected\nconst WelcomeView: React.FC<{ selectedItem: MenuItem }> = ({ selectedItem }) => {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Welcome to Developer Utilities\n </Text>\n </Box>\n\n <Box marginBottom={2}>\n <Text>\n Select a utility from the left menu to get started.\n </Text>\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor=\"yellow\"\n paddingX={2}\n paddingY={1}\n marginBottom={2}\n >\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {selectedItem.icon} {selectedItem.label}\n </Text>\n <Text dimColor>{selectedItem.description}</Text>\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text bold>Quick Actions:</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>• Press <Text color=\"green\">Enter</Text> to open selected utility</Text>\n <Text>• Use <Text color=\"green\">↑/↓</Text> or <Text color=\"green\">j/k</Text> to navigate</Text>\n <Text>• Press <Text color=\"green\">Esc</Text> to go back or quit</Text>\n <Text>• Press <Text color=\"green\">q</Text> to quit anytime</Text>\n </Box>\n\n <Box marginTop={2}>\n <Text dimColor>\n 💡 Tip: Each utility provides an interactive interface for easy usage.\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Active utility view - renders the appropriate component\nconst ActiveUtilityView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n switch (utilityType) {\n case 'password':\n return <PasswordView />;\n case 'uuid':\n return <UuidView />;\n case 'hash':\n return <HashView />;\n case 'base64-encode':\n case 'base64-decode':\n return <Base64View />;\n case 'url-encode':\n case 'url-decode':\n return <UrlView />;\n case 'unix-time':\n return <UnixTimeView />;\n case 'jwt':\n return <JwtView />;\n case 'cron':\n return <CronView />;\n case 'timezone':\n return <TimezoneView />;\n case 'http':\n return <HttpView />;\n case 'markdown':\n return <MarkdownView />;\n default:\n return <PlaceholderView utilityType={utilityType} />;\n }\n};\n\n// Placeholder for utilities not yet implemented\nconst PlaceholderView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n const item = MENU_ITEMS.find((m) => m.id === utilityType);\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {item?.icon} {item?.label}\n </Text>\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"yellow\" paddingX={2} paddingY={1}>\n <Text>\n 🚧 This utility view is under construction.{'\\n'}\n {'\\n'}\n For now, use the command-line version:{'\\n'}\n <Text color=\"green\">$ jai1 utils {utilityType} --help</Text>\n {'\\n'}\n {'\\n'}\n Press <Text color=\"yellow\">Esc</Text> to return to the menu.\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Password Generator View\n * Interactive password generation with options\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const PasswordView: React.FC = () => {\n const [length, setLength] = useState('16');\n const [count, setCount] = useState('1');\n const [passwords, setPasswords] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'length' | 'count' | 'generate'>('length');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n // Cycle through fields\n if (focusedField === 'length') setFocusedField('count');\n else if (focusedField === 'count') setFocusedField('generate');\n else setFocusedField('length');\n } else if (key.return) {\n // Generate passwords on Enter from any field\n handleGenerate();\n } else if (input === 'c' && passwords.length > 0) {\n // Copy first password\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newPasswords: string[] = [];\n const lengthNum = parseInt(length, 10) || 16;\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newPasswords.push(\n service.generatePassword({\n length: lengthNum,\n lowercase: true,\n uppercase: true,\n digits: true,\n symbols: true,\n })\n );\n }\n setPasswords(newPasswords);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(passwords[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Password Generator\n </Text>\n </Box>\n\n {/* Options */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n {/* Length Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'length' ? 'green' : undefined}>\n {focusedField === 'length' ? '▶ ' : ' '}Length:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'length' ? (\n <TextInput value={length} onChange={setLength} />\n ) : (\n <Text>{length}</Text>\n )}\n </Box>\n <Text dimColor>(characters)</Text>\n </Box>\n\n {/* Count Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? '▶ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n <Text dimColor>(passwords to generate)</Text>\n </Box>\n\n {/* Generate Button */}\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate Passwords ]\n </Text>\n </Box>\n </Box>\n\n {/* Results */}\n {passwords.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n ✓ Generated Passwords:\n </Text>\n\n {passwords.map((password, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{password}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> ✓ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next field | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * UUID Generator View\n * Interactive UUID generation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const UuidView: React.FC = () => {\n const [count, setCount] = useState('1');\n const [uppercase, setUppercase] = useState(false);\n const [noHyphens, setNoHyphens] = useState(false);\n const [uuids, setUuids] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'count' | 'uppercase' | 'hyphens' | 'generate'>('count');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['count', 'uppercase', 'hyphens', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'uppercase') {\n setUppercase(!uppercase);\n } else if (focusedField === 'hyphens') {\n setNoHyphens(!noHyphens);\n } else {\n // Generate on Enter from any field (except checkboxes)\n handleGenerate();\n }\n } else if (input === 'c' && uuids.length > 0) {\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newUuids: string[] = [];\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newUuids.push(service.generateUuid({ uppercase, noHyphens }));\n }\n setUuids(newUuids);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(uuids[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🆔 UUID Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? '▶ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'uppercase' ? 'green' : undefined}>\n {focusedField === 'uppercase' ? '▶ ' : ' '}\n [{uppercase ? '✓' : ' '}] Uppercase\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'hyphens' ? 'green' : undefined}>\n {focusedField === 'hyphens' ? '▶ ' : ' '}\n [{noHyphens ? '✓' : ' '}] No Hyphens\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate UUIDs ]\n </Text>\n </Box>\n </Box>\n\n {uuids.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n ✓ Generated UUIDs:\n </Text>\n\n {uuids.map((uuid, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{uuid}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> ✓ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Hash Generator View\n * Interactive hash generation with algorithm selection\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HashAlgorithm } from '../../../services/utils.service.js';\n\nconst ALGORITHMS: HashAlgorithm[] = ['sha256', 'sha512', 'sha1', 'md5', 'bcrypt'];\n\nexport const HashView: React.FC = () => {\n const [text, setText] = useState('hello world');\n const [algorithm, setAlgorithm] = useState<HashAlgorithm>('sha256');\n const [hash, setHash] = useState('');\n const [focusedField, setFocusedField] = useState<'text' | 'algorithm' | 'generate'>('text');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['text', 'algorithm', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Generate on Enter from any field\n handleGenerate();\n } else if (key.leftArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[currentIndex > 0 ? currentIndex - 1 : ALGORITHMS.length - 1]);\n } else if (key.rightArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[(currentIndex + 1) % ALGORITHMS.length]);\n } else if (input === 'c' && hash) {\n handleCopy();\n }\n });\n\n const handleGenerate = async () => {\n if (!text) return;\n\n let result: string;\n if (algorithm === 'bcrypt') {\n result = await service.hashBcrypt(text, 10);\n } else {\n result = await service.hash(text, algorithm);\n }\n setHash(result);\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(hash);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔒 Hash Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'text' ? 'green' : undefined}>\n {focusedField === 'text' ? '▶ ' : ' '}Text to hash:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'text' ? (\n <TextInput value={text} onChange={setText} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!text}>{text || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'algorithm' ? 'green' : undefined}>\n {focusedField === 'algorithm' ? '▶ ' : ' '}Algorithm:\n </Text>\n </Box>\n <Text bold color={focusedField === 'algorithm' ? 'yellow' : undefined}>\n {algorithm.toUpperCase()}\n </Text>\n {focusedField === 'algorithm' && (\n <Text dimColor> (← → to change)</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate Hash ]\n </Text>\n </Box>\n </Box>\n\n {hash && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Hash Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Algorithm: {algorithm.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{hash}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | ←/→: Change algorithm | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Base64 Encoder/Decoder View\n * Interactive Base64 encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const Base64View: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [urlSafe, setUrlSafe] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'urlsafe' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'urlsafe', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n setError('');\n } else if (focusedField === 'urlsafe') {\n setUrlSafe(!urlSafe);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) {\n setError('Input cannot be empty');\n return;\n }\n\n try {\n setError('');\n if (mode === 'encode') {\n const encoded = service.base64Encode(input, urlSafe);\n setResult(encoded);\n } else {\n const decoded = service.base64Decode(input);\n setResult(decoded.toString('utf-8'));\n }\n setCopied(false);\n } catch (err) {\n setError(`Failed to ${mode}: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📝 Base64 Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'encode' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'urlsafe' ? 'green' : undefined}>\n {focusedField === 'urlsafe' ? '▶ ' : ' '}\n [{urlSafe ? '✓' : ' '}] URL-Safe (+ → -, / → _)\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * URL Encoder/Decoder View\n * Interactive URL encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const UrlView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [fullUrl, setFullUrl] = useState(false);\n const [result, setResult] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'full' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'full', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n } else if (focusedField === 'full') {\n setFullUrl(!fullUrl);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) return;\n\n if (mode === 'encode') {\n const encoded = fullUrl\n ? service.urlEncode(input, true)\n : service.urlEncode(input, false);\n setResult(encoded);\n } else {\n const decoded = fullUrl\n ? service.urlDecode(input, true)\n : service.urlDecode(input, false);\n setResult(decoded);\n }\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔗 URL Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text or URL...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'full' ? 'green' : undefined}>\n {focusedField === 'full' ? '▶ ' : ' '}\n [{fullUrl ? '✓' : ' '}] Full URL (encode/decode entire URL)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()} {fullUrl ? '(Full URL)' : '(Component)'}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Unix Time Converter View\n * Interactive Unix timestamp conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'now' | 'to-human' | 'to-unix';\n\nexport const UnixTimeView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('now');\n const [format, setFormat] = useState<'iso' | 'local' | 'utc'>('iso');\n const [useMs, setUseMs] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'input' | 'format' | 'ms' | 'convert'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'now'\n ? ['mode', 'ms', 'convert']\n : mode === 'to-human'\n ? ['mode', 'input', 'format', 'convert']\n : ['mode', 'input', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n const modes: Mode[] = ['now', 'to-human', 'to-unix'];\n const currentIndex = modes.indexOf(mode);\n setMode(modes[(currentIndex + 1) % modes.length]);\n setResult('');\n setError('');\n } else if (focusedField === 'format') {\n const formats: typeof format[] = ['iso', 'local', 'utc'];\n const currentIndex = formats.indexOf(format);\n setFormat(formats[(currentIndex + 1) % formats.length]);\n } else if (focusedField === 'ms') {\n setUseMs(!useMs);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n try {\n setError('');\n if (mode === 'now') {\n const timestamp = service.unixTimeCurrent(useMs);\n setResult(timestamp.toString());\n } else if (mode === 'to-human') {\n if (!input) {\n setError('Please enter a timestamp');\n return;\n }\n const human = service.unixTimeToHuman(parseInt(input, 10), format);\n setResult(human);\n } else {\n if (!input) {\n setError('Please enter a date string');\n return;\n }\n const timestamp = service.unixTimeFromString(input);\n setResult(timestamp.toString());\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🕒 Unix Time Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'now' ? 'CURRENT TIME' : mode === 'to-human' ? 'TIMESTAMP → HUMAN' : 'HUMAN → TIMESTAMP'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n\n {mode !== 'now' && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}\n {mode === 'to-human' ? 'Timestamp:' : 'Date string:'}\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'input' ? (\n <TextInput\n value={input}\n onChange={setInput}\n placeholder={mode === 'to-human' ? '1702550400' : '2024-01-15 10:30:00'}\n />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {mode === 'to-human' && (\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'format' ? 'green' : undefined}>\n {focusedField === 'format' ? '▶ ' : ' '}Format:\n </Text>\n </Box>\n <Text bold color={focusedField === 'format' ? 'yellow' : undefined}>\n {format.toUpperCase()}\n </Text>\n {focusedField === 'format' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n )}\n\n {mode === 'now' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'ms' ? 'green' : undefined}>\n {focusedField === 'ms' ? '▶ ' : ' '}\n [{useMs ? '✓' : ' '}] Milliseconds\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'now' ? 'Get Current' : 'Convert'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * JWT Decoder/Encoder View\n * Interactive JWT decoding and encoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'decode' | 'encode';\n\nexport const JwtView: React.FC = () => {\n const [mode, setMode] = useState<Mode>('decode');\n const [token, setToken] = useState('');\n const [payload, setPayload] = useState('');\n const [secret, setSecret] = useState('');\n const [result, setResult] = useState<{ header?: object; payload?: object; signature?: string; token?: string }>({});\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'token' | 'payload' | 'secret' | 'process'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'decode'\n ? ['mode', 'token', 'process']\n : ['mode', 'payload', 'secret', 'process'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'decode' ? 'encode' : 'decode');\n setResult({});\n setError('');\n } else {\n // Process on Enter from any input field or process button\n handleProcess();\n }\n } else if (input === 'c' && result.token) {\n handleCopy();\n }\n });\n\n const handleProcess = () => {\n try {\n setError('');\n if (mode === 'decode') {\n if (!token) {\n setError('Please enter a JWT token');\n return;\n }\n const decoded = service.jwtDecode(token);\n setResult(decoded);\n } else {\n if (!payload) {\n setError('Please enter payload JSON');\n return;\n }\n if (!secret) {\n setError('Please enter a secret key');\n return;\n }\n const payloadObj = JSON.parse(payload);\n const encoded = service.jwtEncode(payloadObj, secret);\n setResult({ token: encoded });\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Processing failed');\n setResult({});\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result.token || '');\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔑 JWT Decoder/Encoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'decode' ? 'DECODE' : 'ENCODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'decode' ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'token' ? 'green' : undefined}>\n {focusedField === 'token' ? '▶ ' : ' '}JWT Token:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'token' ? (\n <TextInput\n value={token}\n onChange={setToken}\n placeholder=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n />\n ) : (\n <Text dimColor={!token}>{token || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n ) : (\n <>\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'payload' ? 'green' : undefined}>\n {focusedField === 'payload' ? '▶ ' : ' '}Payload (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'payload' ? (\n <TextInput\n value={payload}\n onChange={setPayload}\n placeholder='{\"sub\":\"123\",\"name\":\"John\"}'\n />\n ) : (\n <Text dimColor={!payload}>{payload || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'secret' ? 'green' : undefined}>\n {focusedField === 'secret' ? '▶ ' : ' '}Secret Key:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'secret' ? (\n <TextInput\n value={secret}\n onChange={setSecret}\n placeholder=\"your-secret-key\"\n mask=\"*\"\n />\n ) : (\n <Text dimColor={!secret}>\n {secret ? '*'.repeat(secret.length) : '(empty)'}\n </Text>\n )}\n </Box>\n </Box>\n </>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'process' ? 'green' : undefined}\n color={focusedField === 'process' ? 'black' : 'green'}\n >\n {focusedField === 'process' ? '▶ ' : ' '}\n [ {mode === 'decode' ? 'Decode' : 'Encode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {(result.header || result.token) && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && result.token && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n {result.header && (\n <>\n <Text bold color=\"yellow\">Header:</Text>\n <Text>{JSON.stringify(result.header, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Payload:</Text>\n <Text>{JSON.stringify(result.payload, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Signature:</Text>\n <Text dimColor>{result.signature}</Text>\n </>\n )}\n {result.token && (\n <>\n <Text bold color=\"yellow\">Token:</Text>\n <Text wrap=\"wrap\">{result.token}</Text>\n </>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/{mode === 'decode' ? 'Decode' : 'Encode'} | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Cron Parser View\n * Interactive cron expression parsing and explanation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const CronView: React.FC = () => {\n const [expression, setExpression] = useState('');\n const [result, setResult] = useState<{ description: string; nextRuns: string[] } | null>(null);\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'expression' | 'parse'>('expression');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'expression' ? 'parse' : 'expression');\n } else if (key.return) {\n // Parse on Enter from any field\n handleParse();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleParse = () => {\n if (!expression) {\n setError('Please enter a cron expression');\n return;\n }\n\n try {\n setError('');\n const parsed = service.parseCron(expression);\n setResult(parsed);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to parse cron expression');\n setResult(null);\n }\n };\n\n const handleCopy = async () => {\n if (!result) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = `${result.description}\\n\\nNext runs:\\n${result.nextRuns.join('\\n')}`;\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⏰ Cron Expression Parser\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'expression' ? 'green' : undefined}>\n {focusedField === 'expression' ? '▶ ' : ' '}Cron Expression:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'expression' ? (\n <TextInput\n value={expression}\n onChange={setExpression}\n placeholder=\"0 5 * * * (5-field or 6-field)\"\n />\n ) : (\n <Text dimColor={!expression}>{expression || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1} marginBottom={1}>\n <Text dimColor>\n Examples: \"0 5 * * *\" (daily at 5am), \"*/15 * * * *\" (every 15 min)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'parse' ? 'green' : undefined}\n color={focusedField === 'parse' ? 'black' : 'green'}\n >\n {focusedField === 'parse' ? '▶ ' : ' '}\n [ Parse Expression ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">Expression:</Text>\n <Text>{expression}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Meaning:</Text>\n <Text>{result.description}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Next 5 executions:</Text>\n {result.nextRuns.map((run, index) => (\n <Text key={index}> {index + 1}. {run}</Text>\n ))}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Parse | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Timezone Converter View\n * Interactive timezone conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const TimezoneView: React.FC = () => {\n const [time, setTime] = useState('');\n const [fromTz, setFromTz] = useState('UTC');\n const [toTz, setToTz] = useState('America/New_York');\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'time' | 'from' | 'to' | 'convert'>('time');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['time', 'from', 'to', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Convert on Enter from any field\n handleConvert();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!time) {\n setError('Please enter a time');\n return;\n }\n if (!fromTz || !toTz) {\n setError('Please enter both timezones');\n return;\n }\n\n try {\n setError('');\n const converted = service.convertTimezone(time, fromTz, toTz);\n setResult(converted);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🌍 Timezone Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'time' ? 'green' : undefined}>\n {focusedField === 'time' ? '▶ ' : ' '}Time:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'time' ? (\n <TextInput\n value={time}\n onChange={setTime}\n placeholder=\"2024-01-15 10:00:00\"\n />\n ) : (\n <Text dimColor={!time}>{time || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'from' ? 'green' : undefined}>\n {focusedField === 'from' ? '▶ ' : ' '}From Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'from' ? (\n <TextInput\n value={fromTz}\n onChange={setFromTz}\n placeholder=\"UTC or America/New_York\"\n />\n ) : (\n <Text dimColor={!fromTz}>{fromTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'to' ? 'green' : undefined}>\n {focusedField === 'to' ? '▶ ' : ' '}To Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'to' ? (\n <TextInput\n value={toTz}\n onChange={setToTz}\n placeholder=\"Asia/Tokyo or Europe/London\"\n />\n ) : (\n <Text dimColor={!toTz}>{toTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>\n Common: UTC, America/New_York, Europe/London, Asia/Tokyo\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ Convert ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>From: {fromTz}</Text>\n <Text dimColor>To: {toTz}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * HTTP Request View\n * Interactive HTTP request tool\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HttpResponse } from '../../../services/utils.service.js';\n\nconst METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n\nexport const HttpView: React.FC = () => {\n const [url, setUrl] = useState('');\n const [method, setMethod] = useState<string>('GET');\n const [headers, setHeaders] = useState('');\n const [body, setBody] = useState('');\n const [response, setResponse] = useState<HttpResponse | null>(null);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [focusedField, setFocusedField] = useState<'url' | 'method' | 'headers' | 'body' | 'send'>('url');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (loading) return;\n\n if (key.tab) {\n const fields: typeof focusedField[] = ['url', 'method', 'headers', 'body', 'send'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.leftArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[currentIndex > 0 ? currentIndex - 1 : METHODS.length - 1]);\n } else if (key.rightArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[(currentIndex + 1) % METHODS.length]);\n } else if (key.return && focusedField === 'send') {\n handleSend();\n } else if (input === 'c' && response) {\n handleCopy();\n }\n });\n\n const handleSend = async () => {\n if (!url) {\n setError('Please enter a URL');\n return;\n }\n\n try {\n setError('');\n setLoading(true);\n\n const headersObj: Record<string, string> = {};\n if (headers) {\n const headerLines = headers.split('\\n');\n for (const line of headerLines) {\n const [key, ...valueParts] = line.split(':');\n if (key && valueParts.length > 0) {\n headersObj[key.trim()] = valueParts.join(':').trim();\n }\n }\n }\n\n const result = await service.httpRequest(url, {\n method,\n headers: headersObj,\n body: body || undefined,\n });\n\n setResponse(result);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Request failed');\n setResponse(null);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopy = async () => {\n if (!response) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = typeof response.body === 'string'\n ? response.body\n : JSON.stringify(response.body, null, 2);\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🌐 HTTP Request\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Request:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'url' ? 'green' : undefined}>\n {focusedField === 'url' ? '▶ ' : ' '}URL:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'url' ? (\n <TextInput\n value={url}\n onChange={setUrl}\n placeholder=\"https://api.example.com/endpoint\"\n />\n ) : (\n <Text dimColor={!url}>{url || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'method' ? 'green' : undefined}>\n {focusedField === 'method' ? '▶ ' : ' '}Method:\n </Text>\n </Box>\n <Text bold color={focusedField === 'method' ? 'yellow' : undefined}>\n {method}\n </Text>\n {focusedField === 'method' && (\n <Text dimColor> (← → to change)</Text>\n )}\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'headers' ? 'green' : undefined}>\n {focusedField === 'headers' ? '▶ ' : ' '}Headers (one per line, Key: Value):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'headers' ? (\n <TextInput\n value={headers}\n onChange={setHeaders}\n placeholder=\"Authorization: Bearer token\"\n />\n ) : (\n <Text dimColor={!headers}>{headers || '(none)'}</Text>\n )}\n </Box>\n </Box>\n\n {(method === 'POST' || method === 'PUT' || method === 'PATCH') && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'body' ? 'green' : undefined}>\n {focusedField === 'body' ? '▶ ' : ' '}Body (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'body' ? (\n <TextInput\n value={body}\n onChange={setBody}\n placeholder='{\"key\":\"value\"}'\n />\n ) : (\n <Text dimColor={!body}>{body || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'send' ? 'green' : undefined}\n color={focusedField === 'send' ? 'black' : 'green'}\n >\n {focusedField === 'send' ? '▶ ' : ' '}\n [ {loading ? 'Sending...' : 'Send Request'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {response && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Response:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied body to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>\n Status: <Text color={response.status < 400 ? 'green' : 'red'}>{response.status}</Text>\n </Text>\n <Text>Time: {response.time}ms</Text>\n <Text>Size: {response.size}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Headers:</Text>\n {Object.entries(response.headers).slice(0, 5).map(([key, value]) => (\n <Text key={key} dimColor> {key}: {value}</Text>\n ))}\n <Text> </Text>\n\n <Text bold color=\"yellow\">Body:</Text>\n <Text>\n {typeof response.body === 'string'\n ? response.body.slice(0, 500)\n : JSON.stringify(response.body, null, 2).slice(0, 500)}\n </Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | ←/→: Change method | Enter: Send | C: Copy body | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Markdown Preview View\n * Interactive markdown file preview\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport const MarkdownView: React.FC = () => {\n const [filePath, setFilePath] = useState('');\n const [content, setContent] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'file' | 'preview'>('file');\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'file' ? 'preview' : 'file');\n } else if (key.return) {\n // Preview on Enter from any field\n handlePreview();\n }\n });\n\n const handlePreview = async () => {\n if (!filePath) {\n setError('Please enter a file path');\n return;\n }\n\n try {\n setError('');\n\n const resolvedPath = path.resolve(filePath);\n if (!fs.existsSync(resolvedPath)) {\n setError(`File not found: ${resolvedPath}`);\n return;\n }\n\n let fileContent = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Pre-process Mermaid diagrams\n fileContent = fileContent.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n🎨 **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n💡 *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Import marked and marked-terminal dynamically\n const { marked } = await import('marked');\n const { default: markedTerminal } = await import('marked-terminal');\n\n // Configure marked with terminal renderer\n marked.use(markedTerminal() as any);\n\n // Render markdown\n const rendered = marked(fileContent) as string;\n setContent(rendered);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to preview file');\n setContent('');\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📄 Markdown Preview\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'file' ? 'green' : undefined}>\n {focusedField === 'file' ? '▶ ' : ' '}File path:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'file' ? (\n <TextInput\n value={filePath}\n onChange={setFilePath}\n placeholder=\"./README.md or /path/to/file.md\"\n />\n ) : (\n <Text dimColor={!filePath}>{filePath || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'preview' ? 'green' : undefined}\n color={focusedField === 'preview' ? 'black' : 'green'}\n >\n {focusedField === 'preview' ? '▶ ' : ' '}\n [ Preview File ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {content && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Preview:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>{content}</Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Preview | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","import { Command } from 'commander';\nimport { createKitListCommand } from './list.js';\nimport { createKitInfoCommand } from './info.js';\nimport { createKitCreateCommand } from './create.js';\n\nexport function createKitCommand(): Command {\n const cmd = new Command('kit')\n .description('Manage starter kits for new projects')\n .action(() => {\n // Default: show help\n cmd.help();\n });\n\n cmd.addCommand(createKitListCommand());\n cmd.addCommand(createKitInfoCommand());\n cmd.addCommand(createKitCreateCommand());\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitListCommand(): Command {\n return new Command('list')\n .description('List available starter kits')\n .option('-c, --category <category>', 'Filter by category (backend, frontend, fullstack)')\n .option('-s, --search <term>', 'Search kits by name or description')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const kitService = new StarterKitService();\n const kits = await kitService.list(config, {\n category: options.category,\n search: options.search,\n });\n\n if (kits.length === 0) {\n console.log('No starter kits found.');\n return;\n }\n\n // Group by category\n const byCategory: Record<string, typeof kits> = {};\n for (const kit of kits) {\n if (!byCategory[kit.category]) {\n byCategory[kit.category] = [];\n }\n byCategory[kit.category].push(kit);\n }\n\n console.log('📦 Available Starter Kits:\\n');\n\n for (const [category, categoryKits] of Object.entries(byCategory)) {\n console.log(`${category.charAt(0).toUpperCase() + category.slice(1)}:`);\n for (const kit of categoryKits) {\n const tags = kit.tags.length > 0 ? ` [${kit.tags.join(', ')}]` : '';\n console.log(\n ` ${kit.slug.padEnd(20)} ${kit.description.slice(0, 50).padEnd(52)} v${kit.version}${tags}`\n );\n }\n console.log();\n }\n });\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport AdmZip from 'adm-zip';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\nexport interface StarterKit {\n id: number;\n slug: string;\n name: string;\n description: string;\n category: string;\n tags: string[];\n version: string;\n downloads: number;\n}\n\nexport interface StarterKitFull extends StarterKit {\n config: KitConfig;\n}\n\nexport interface KitConfig {\n slug: string;\n name: string;\n description: string;\n category: string;\n tags?: string[];\n version: string;\n requiredTools?: string[];\n variables?: Variable[];\n hooks?: {\n preInit?: string[];\n postExtract?: string[];\n postInit?: string[];\n };\n framework?: {\n apply: boolean;\n components: string[];\n };\n ide?: {\n promptSync?: boolean;\n defaultTargets?: string[];\n };\n git?: {\n init: boolean;\n initialCommit?: string;\n };\n}\n\nexport interface Variable {\n name: string;\n prompt: string;\n type?: 'text' | 'select';\n default?: string;\n options?: string[];\n validate?: string;\n}\n\n/**\n * Service for managing starter kits\n */\nexport class StarterKitService {\n /**\n * List available starter kits\n */\n async list(\n config: Jai1Config,\n options?: { category?: string; search?: string }\n ): Promise<StarterKit[]> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/starter-kits${params.toString() ? '?' + params : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list starter kits: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { kits: StarterKit[] };\n return data.kits;\n }\n\n /**\n * Get single starter kit with full config\n */\n async get(config: Jai1Config, slug: string): Promise<StarterKitFull> {\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Starter kit not found: ${slug}`);\n }\n throw new NetworkError(`Failed to get starter kit: HTTP ${response.status}`);\n }\n\n return (await response.json()) as StarterKitFull;\n }\n\n /**\n * Download and extract starter kit\n */\n async downloadAndExtract(\n config: Jai1Config,\n slug: string,\n targetDir: string,\n onProgress?: (percent: number) => void\n ): Promise<void> {\n if (onProgress) onProgress(10);\n\n // Download zip directly from API (streams from R2)\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}/download`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to download kit: HTTP ${response.status}`);\n }\n\n if (onProgress) onProgress(30);\n\n // Save to temp file\n const tmpDir = join(process.env.TMPDIR || '/tmp', 'jai1-kits');\n await fs.mkdir(tmpDir, { recursive: true });\n const tmpFile = join(tmpDir, `${slug}.zip`);\n\n const buffer = await response.arrayBuffer();\n await fs.writeFile(tmpFile, Buffer.from(buffer));\n\n if (onProgress) onProgress(60);\n\n // Extract\n const zip = new AdmZip(tmpFile);\n await fs.mkdir(targetDir, { recursive: true });\n zip.extractAllTo(targetDir, true);\n\n if (onProgress) onProgress(100);\n\n // Cleanup\n await fs.unlink(tmpFile);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitInfoCommand(): Command {\n return new Command('info')\n .description('Show detailed information about a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .action(async (slug) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const kitService = new StarterKitService();\n const kit = await kitService.get(config, slug);\n\n console.log(`📦 ${kit.name}\\n`);\n console.log(`Description: ${kit.description}`);\n console.log(`Category: ${kit.category}`);\n console.log(`Version: ${kit.version}`);\n console.log(`Downloads: ${kit.downloads}`);\n\n if (kit.tags.length > 0) {\n console.log(`Tags: ${kit.tags.join(', ')}`);\n }\n\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log(`\\nRequired Tools:`);\n kit.config.requiredTools.forEach((tool) => {\n console.log(` - ${tool}`);\n });\n }\n\n if (kit.config.framework?.apply && kit.config.framework.components.length > 0) {\n console.log(`\\nIncluded Framework Components:`);\n kit.config.framework.components.forEach((comp) => {\n console.log(` - ${comp}`);\n });\n }\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n console.log(`\\nVariables (prompted during creation):`);\n kit.config.variables.forEach((v) => {\n console.log(` - ${v.name}: ${v.prompt}${v.default ? ` (default: ${v.default})` : ''}`);\n });\n }\n\n if (kit.config.hooks?.postInit && kit.config.hooks.postInit.length > 0) {\n console.log(`\\nPost-Init Commands:`);\n kit.config.hooks.postInit.forEach((cmd) => {\n console.log(` - ${cmd}`);\n });\n }\n });\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, input, checkbox } from '@inquirer/prompts';\nimport { execa } from 'execa';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { HookExecutor } from '../../services/hook-executor.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitCreateCommand(): Command {\n return new Command('create')\n .description('Create a new project from a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .argument('[directory]', 'Project directory (default: ./<slug>)')\n .option('-y, --yes', 'Auto mode - use defaults, no prompts')\n .option('--name <name>', 'Project name')\n .option('--skip-install', 'Skip dependency installation')\n .option('--skip-git', 'Skip git initialization')\n .option('--skip-framework', 'Skip framework apply')\n .option('--skip-ide', 'Skip IDE sync')\n .action(async (slug, directory, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const isAutoMode = options.yes === true;\n const kitService = new StarterKitService();\n\n // Step 1: Fetch metadata\n console.log(`📦 Fetching starter kit: ${slug}...`);\n const kit = await kitService.get(config, slug);\n\n // Step 2: Check required tools\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log('🔍 Checking required tools...');\n for (const tool of kit.config.requiredTools) {\n try {\n await execa('which', [tool]);\n } catch {\n console.warn(`⚠️ Warning: Required tool '${tool}' not found`);\n }\n }\n }\n\n // Determine target directory\n const targetDir = directory || join(process.cwd(), options.name || slug);\n\n // Check if directory exists\n try {\n await fs.access(targetDir);\n throw new Error(`Directory already exists: ${targetDir}`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n // Step 3: Run preInit hooks\n if (kit.config.hooks?.preInit && kit.config.hooks.preInit.length > 0) {\n console.log('🔧 Running pre-init hooks...');\n const hookExecutor = new HookExecutor(process.cwd(), {});\n await hookExecutor.run(kit.config.hooks.preInit);\n }\n\n // Step 4: Download and extract\n console.log('📥 Downloading template...');\n await kitService.downloadAndExtract(config, slug, targetDir, (percent) => {\n if (percent === 100) {\n console.log(' ✓ Downloaded and extracted');\n }\n });\n\n // Step 5: Run postExtract hooks\n if (kit.config.hooks?.postExtract && kit.config.hooks.postExtract.length > 0) {\n console.log('📄 Setting up environment...');\n const hookExecutor = new HookExecutor(targetDir, {});\n await hookExecutor.run(kit.config.hooks.postExtract);\n }\n\n // Step 6: Prompt variables or use defaults\n const variables: Record<string, string> = {};\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n if (isAutoMode) {\n console.log('📝 Using default values (auto mode)');\n for (const v of kit.config.variables) {\n variables[v.name] =\n options.name && v.name === 'PROJECT_NAME'\n ? options.name\n : v.default || '';\n }\n } else {\n console.log('📝 Please provide project details:');\n for (const v of kit.config.variables) {\n if (v.type === 'select' && v.options) {\n const answer = await select({\n message: v.prompt,\n choices: v.options.map((opt) => ({ name: opt, value: opt })),\n default: v.default,\n });\n variables[v.name] = answer as string;\n } else {\n const answer = await input({\n message: v.prompt,\n default: v.default,\n });\n variables[v.name] = answer;\n }\n }\n }\n }\n\n // Step 7: Apply variable substitution\n if (Object.keys(variables).length > 0) {\n await applyVariableSubstitution(targetDir, variables);\n }\n\n // Step 8: Apply framework components\n if (!options.skipFramework && kit.config.framework?.apply) {\n console.log('🤖 Applying jai1 framework...');\n const componentsService = new ComponentsService(targetDir);\n\n for (const filepath of kit.config.framework.components) {\n console.log(` 📥 Installing ${filepath}...`);\n await componentsService.install(config, filepath);\n }\n\n console.log(' ✓ Framework components applied');\n }\n\n // Step 9: Git init\n if (!options.skipGit && kit.config.git?.init) {\n console.log('🔧 Initializing git repository...');\n await execa('git', ['init'], { cwd: targetDir });\n await execa('git', ['add', '.'], { cwd: targetDir });\n const commitMsg = kit.config.git.initialCommit || 'Initial commit';\n await execa('git', ['commit', '-m', commitMsg], { cwd: targetDir });\n console.log(' ✓ Git initialized');\n }\n\n // Step 10: Run postInit hooks\n if (!options.skipInstall && kit.config.hooks?.postInit) {\n console.log('🔧 Running setup...');\n const hookExecutor = new HookExecutor(targetDir, variables);\n await hookExecutor.run(kit.config.hooks.postInit);\n }\n\n // Step 11: IDE sync\n const shouldPromptIdeSync = kit.config.ide?.promptSync !== false;\n if (!options.skipIde && shouldPromptIdeSync) {\n const ideChoices = [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Windsurf', value: 'windsurf' },\n { name: 'Claude Code', value: 'claude-code' },\n { name: 'Antigravity', value: 'antigravity' },\n ];\n\n let selectedIdes: string[] = [];\n\n if (isAutoMode) {\n selectedIdes = kit.config.ide?.defaultTargets || [];\n if (selectedIdes.length > 0) {\n console.log(`🖥️ Syncing to IDEs: ${selectedIdes.join(', ')}`);\n }\n } else {\n const defaultTargets = kit.config.ide?.defaultTargets || [];\n const answer = await checkbox({\n message: 'Chọn IDE để sync framework:',\n choices: ideChoices.map((c) => ({\n ...c,\n checked: defaultTargets.includes(c.value),\n })),\n });\n selectedIdes = answer as string[];\n }\n\n if (selectedIdes.length > 0) {\n await execa('jai1', ['ide', 'sync', ...selectedIdes], {\n cwd: targetDir,\n stdio: 'inherit',\n });\n }\n }\n\n // Done\n console.log('\\n✅ Project created successfully!');\n console.log(`📁 Location: ${targetDir}`);\n console.log('\\n💡 Next steps:');\n console.log(` cd ${targetDir}`);\n console.log(' jai1 apply # Install framework components');\n console.log(' jai1 ide sync <ides> # Sync to your IDE(s)');\n });\n}\n\n/**\n * Apply variable substitution to files\n */\nasync function applyVariableSubstitution(\n dir: string,\n variables: Record<string, string>\n): Promise<void> {\n const files = await getAllFiles(dir);\n\n for (const file of files) {\n let content = await fs.readFile(file, 'utf-8');\n let modified = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n if (regex.test(content)) {\n content = content.replace(regex, value);\n modified = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(file, content, 'utf-8');\n }\n }\n}\n\n/**\n * Get all files recursively\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n files.push(...(await getAllFiles(fullPath)));\n }\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import { execa } from 'execa';\n\n/**\n * Service for executing kit hooks\n */\nexport class HookExecutor {\n constructor(\n private cwd: string,\n private variables: Record<string, string>\n ) {}\n\n /**\n * Run hooks sequentially\n */\n async run(hooks: string[]): Promise<void> {\n for (const hook of hooks) {\n const cmd = this.replaceVariables(hook);\n console.log(` $ ${cmd}`);\n\n try {\n await execa(cmd, {\n cwd: this.cwd,\n shell: true,\n stdio: 'inherit',\n });\n } catch (error) {\n throw new Error(`Hook failed: ${cmd}`);\n }\n }\n }\n\n /**\n * Replace variables in command\n */\n private replaceVariables(cmd: string): string {\n let result = cmd;\n for (const [key, value] of Object.entries(this.variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n }\n}\n","/**\n * Upgrade Command\n * Update jai1-client to the latest version\n * \n * Renamed from 'self-update' to 'upgrade' for clarity\n * - 'update' = update installed components\n * - 'upgrade' = upgrade the CLI tool itself\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create upgrade command\n */\nexport function createUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force upgrade without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleUpgrade(options);\n });\n}\n\nasync function handleUpgrade(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 upgrade\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Upgrade cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully upgraded to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('upgrade', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Upgrade failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually upgrading with:${colors.reset}`);\n\n // Show manual upgrade command for detected package manager\n const manualCommands = {\n npm: `npm install -g @jvittechs/jai1-cli@latest`,\n pnpm: `pnpm add -g @jvittechs/jai1-cli@latest`,\n yarn: `yarn global add @jvittechs/jai1-cli@latest`,\n bun: `bun add -g @jvittechs/jai1-cli@latest`\n };\n\n console.error(` ${colors.cyan}${manualCommands[packageManager]}${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager was used to install jai1\n * Priority:\n * 1. Check how jai1 was installed (via global bin path) - MOST RELIABLE\n * 2. Check npm_config_user_agent environment variable\n * 3. Default to npm (safest fallback)\n * \n * Supports both Windows and Unix paths\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // 1. Try to detect from actual jai1 installation path (MOST RELIABLE)\n try {\n const jai1Path = execSync('which jai1 || where jai1', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore']\n }).trim();\n\n if (jai1Path) {\n // Normalize path separators for consistent matching (Windows uses \\, Unix uses /)\n const normalizedPath = jai1Path.toLowerCase().replace(/\\\\/g, '/');\n\n // pnpm global paths:\n // - Unix: ~/.local/share/pnpm or ~/Library/pnpm\n // - Windows: C:/Users/username/AppData/Local/pnpm\n if (normalizedPath.includes('/pnpm/')) return 'pnpm';\n\n // yarn global paths:\n // - Unix: ~/.yarn or ~/Library/Yarn\n // - Windows: C:/Users/username/AppData/Local/Yarn\n if (normalizedPath.includes('/.yarn/') || normalizedPath.includes('/yarn/')) return 'yarn';\n\n // bun global paths:\n // - Unix: ~/.bun\n // - Windows: C:/Users/username/.bun\n if (normalizedPath.includes('/.bun/')) return 'bun';\n\n // npm global paths:\n // Unix:\n // - nvm: ~/.nvm/versions/node/vX.X.X/bin/\n // - system: /usr/local/bin/ or /usr/bin/\n // - npm prefix: ~/.npm-global/bin/ or similar\n // - node_modules: anywhere with /node_modules/.bin/\n // Windows:\n // - AppData: C:/Users/username/AppData/Roaming/npm/\n // - Program Files: C:/Program Files/nodejs/\n // - node_modules: anywhere with /node_modules/\n if (normalizedPath.includes('/.nvm/') ||\n normalizedPath.includes('/node_modules/') ||\n normalizedPath.includes('/lib/node_modules/') ||\n normalizedPath.includes('/npm-global/') ||\n normalizedPath.includes('/usr/local/bin/') ||\n normalizedPath.includes('/usr/bin/') ||\n normalizedPath.includes('/appdata/roaming/npm/') ||\n normalizedPath.includes('/program files/nodejs/')) {\n return 'npm';\n }\n }\n } catch {\n // Ignore errors, continue with other detection methods\n }\n\n // 2. Check user agent for package manager (when running via npm/pnpm/yarn scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Default to npm (safest and most common)\n // DO NOT check for available package managers here - it causes false positives!\n // If user has pnpm installed but used npm to install jai1, we should use npm.\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","/**\n * Clean Command\n * Clean up backups, cache, and temporary files\n * \n * Renamed from 'clear-backups' to 'clean' for broader scope\n */\nimport { Command } from 'commander';\nimport { confirm, select } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\ninterface CleanTarget {\n name: string;\n description: string;\n path: string;\n check: () => Promise<{ exists: boolean; count?: number; size?: string }>;\n clean: () => Promise<void>;\n}\n\n/**\n * Create clean command\n */\nexport function createCleanCommand(): Command {\n return new Command('clean')\n .description('Clean up backups, cache, and temporary files')\n .option('-y, --yes', 'Skip confirmation')\n .option('--backups', 'Clean only backup files')\n .option('--all', 'Clean all (backups + cache)')\n .action(async (options: { yes?: boolean; backups?: boolean; all?: boolean }) => {\n await handleClean(options);\n });\n}\n\nasync function handleClean(options: { yes?: boolean; backups?: boolean; all?: boolean }) {\n const cwd = process.cwd();\n const service = new ComponentsService();\n\n // Define clean targets\n const targets: CleanTarget[] = [\n {\n name: 'Backups',\n description: 'Component backup files (.jai1_backup/)',\n path: join(cwd, '.jai1_backup'),\n check: async () => {\n const backups = await service.listBackups(cwd);\n return { exists: backups.length > 0, count: backups.length };\n },\n clean: async () => {\n await service.clearBackups(cwd);\n }\n },\n // Future targets can be added here:\n // {\n // name: 'Cache',\n // description: 'Downloaded component cache',\n // path: join(homedir(), '.jai1', 'cache'),\n // ...\n // }\n ];\n\n console.log('🧹 Clean up jai1-client files\\n');\n\n // Check what's available to clean\n const availableTargets: Array<{ target: CleanTarget; info: { exists: boolean; count?: number } }> = [];\n\n for (const target of targets) {\n const info = await target.check();\n if (info.exists) {\n availableTargets.push({ target, info });\n }\n }\n\n if (availableTargets.length === 0) {\n console.log('✨ Nothing to clean up!');\n return;\n }\n\n // If specific option provided\n if (options.backups) {\n const backupTarget = targets.find(t => t.name === 'Backups');\n if (backupTarget) {\n await cleanTarget(backupTarget, options.yes);\n }\n return;\n }\n\n if (options.all) {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n return;\n }\n\n // Interactive mode\n console.log('Found the following items:\\n');\n for (const { target, info } of availableTargets) {\n const countStr = info.count ? ` (${info.count} items)` : '';\n console.log(` 📁 ${target.name}${countStr}`);\n console.log(` ${target.description}`);\n console.log(` Path: ${target.path}\\n`);\n }\n\n const action = await select({\n message: 'What do you want to clean?',\n choices: [\n ...availableTargets.map(({ target, info }) => ({\n name: `${target.name}${info.count ? ` (${info.count} items)` : ''}`,\n value: target.name\n })),\n { name: '🧹 Clean all', value: 'all' },\n { name: '❌ Cancel', value: 'cancel' }\n ]\n });\n\n if (action === 'cancel') {\n console.log('\\n❌ Operation cancelled.');\n return;\n }\n\n if (action === 'all') {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n } else {\n const target = targets.find(t => t.name === action);\n if (target) {\n await cleanTarget(target, options.yes);\n }\n }\n}\n\nasync function cleanTarget(target: CleanTarget, skipConfirm?: boolean): Promise<void> {\n const info = await target.check();\n\n if (!info.exists) {\n console.log(`✨ ${target.name}: Nothing to clean.`);\n return;\n }\n\n const countStr = info.count ? ` (${info.count} items)` : '';\n\n if (!skipConfirm) {\n const confirmed = await confirm({\n message: `Delete ${target.name}${countStr}?`,\n default: false\n });\n\n if (!confirmed) {\n console.log(`⏭️ Skipped ${target.name}`);\n return;\n }\n }\n\n try {\n await target.clean();\n console.log(`✅ Cleaned ${target.name}${countStr}`);\n } catch (error) {\n console.error(`❌ Failed to clean ${target.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { checkConnectivity } from '../../services/redmine-connectivity.service.js';\n\ninterface CheckOptions {\n config?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine check command\n */\nexport function createRedmineCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check Redmine connectivity')\n .option('-c, --config <path>', 'Config file path', 'redmine.config.yaml')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleRedmineCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleRedmineCheck(options: CheckOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const result = await checkConnectivity(config);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅', result.message);\n if (result.details?.project) {\n console.log(\n ` Project: ${result.details.project.name} (${result.details.project.identifier})`\n );\n console.log(` Project ID: ${result.details.project.id}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineConfigSchema } from '../types/redmine.types.js';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\n\n/**\n * Service for managing Redmine configuration\n */\nexport class RedmineConfigService {\n private configPath: string;\n\n constructor(configPath?: string) {\n this.configPath = configPath ?? resolve(process.cwd(), 'redmine.config.yaml');\n }\n\n /**\n * Load Redmine configuration from YAML file\n */\n async load(): Promise<RedmineConfig> {\n try {\n const content = await readFile(this.configPath, 'utf-8');\n const rawConfig = parse(content);\n\n return RedmineConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new NotFoundError(`Configuration file not found: ${this.configPath}`);\n }\n\n throw new ValidationError(\n `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate configuration object\n */\n validate(config: unknown): RedmineConfig {\n try {\n return RedmineConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\n// Export schema for use in types file\nexport { RedmineConfigSchema };\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst RetryConfigSchema = z.object({\n retries: z.number().min(0).default(3),\n baseMs: z.number().min(100).default(300),\n});\n\nconst FilenameConfigSchema = z.object({\n pattern: z.string().default('{issueId}-{slug}.md'),\n slug: z.object({\n maxLength: z.number().min(10).default(80),\n dedupe: z.boolean().default(true),\n lowercase: z.boolean().default(true),\n }),\n renameOnTitleChange: z.boolean().default(false),\n});\n\nconst CommentsConfigSchema = z.object({\n anchors: z.object({\n start: z.string().default('<!-- redmine:comments:start -->'),\n end: z.string().default('<!-- redmine:comments:end -->'),\n }),\n trackBy: z.enum(['journalId', 'createdOn']).default('journalId'),\n});\n\nconst DefaultsConfigSchema = z.object({\n include: z.array(z.enum(['journals', 'relations', 'attachments'])).default(['journals']),\n status: z.string().default('*'),\n pageSize: z.number().min(1).max(100).default(100),\n concurrency: z.number().min(1).max(10).default(4),\n retry: RetryConfigSchema.default({}),\n});\n\nconst ProjectConfigSchema = z.object({\n id: z.number(),\n identifier: z.string(),\n});\n\nconst RedmineConfigSchema = z.object({\n baseUrl: z.string().url(),\n apiAccessToken: z.string().min(1),\n project: ProjectConfigSchema,\n outputDir: z.string().default('.jai1/redmine'),\n defaults: DefaultsConfigSchema.default({}),\n filename: FilenameConfigSchema.default({}),\n comments: CommentsConfigSchema.default({}),\n});\n\nexport type RedmineConfig = z.infer<typeof RedmineConfigSchema>;\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\nexport type FilenameConfig = z.infer<typeof FilenameConfigSchema>;\nexport type CommentsConfig = z.infer<typeof CommentsConfigSchema>;\nexport type DefaultsConfig = z.infer<typeof DefaultsConfigSchema>;\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\n// Export schema for use in service\nexport { RedmineConfigSchema };\n","import { fetch } from 'undici';\nimport pRetry from 'p-retry';\nimport pLimit from 'p-limit';\nimport type { RedmineConfig, RetryConfig } from './config.js';\n\nexport interface RedmineIssue {\n id: number;\n subject: string;\n description: string;\n status: { id: number; name: string };\n priority: { id: number; name: string };\n author: { id: number; name: string };\n assigned_to?: { id: number; name: string };\n created_on: string;\n updated_on: string;\n project: { id: number; name: string };\n tracker: { id: number; name: string };\n journals?: RedmineJournal[];\n relations?: RedmineRelation[];\n attachments?: RedmineAttachment[];\n}\n\nexport interface RedmineJournal {\n id: number;\n user: { id: number; name: string };\n notes?: string;\n created_on: string;\n details?: Array<{\n name: string;\n old_value: string;\n new_value: string;\n }>;\n}\n\nexport interface RedmineRelation {\n id: number;\n issue_to_id: number;\n relation_type: string;\n delay?: number;\n}\n\nexport interface RedmineAttachment {\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: { id: number; name: string };\n created_on: string;\n content_url?: string;\n}\n\nexport interface RedmineIssueResponse {\n issue: RedmineIssue;\n}\n\nexport interface RedmineIssuesResponse {\n issues: RedmineIssue[];\n total_count: number;\n offset: number;\n limit: number;\n}\n\nexport interface RedmineProjectResponse {\n project: {\n id: number;\n identifier: string;\n name: string;\n created_on: string;\n updated_on: string;\n };\n}\n\nexport class RedmineApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: unknown\n ) {\n super(message);\n this.name = 'RedmineApiError';\n }\n}\n\nexport class RedmineApiClient {\n private readonly baseUrl: string;\n private readonly apiAccessToken: string;\n private readonly retryConfig: RetryConfig;\n private readonly concurrencyLimit: pLimit.Limit;\n\n constructor(config: RedmineConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiAccessToken = config.apiAccessToken;\n this.retryConfig = config.defaults.retry;\n this.concurrencyLimit = pLimit(config.defaults.concurrency);\n }\n\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers = {\n 'X-Redmine-API-Key': this.apiAccessToken,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const attempt = async (): Promise<T> => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = (await response.json()) as { errors?: string[] };\n if (errorData.errors && Array.isArray(errorData.errors)) {\n errorMessage = errorData.errors.join(', ');\n }\n } catch {\n // Ignore JSON parsing errors for error response\n }\n\n throw new RedmineApiError(errorMessage, response.status);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as unknown as T;\n };\n\n return pRetry(attempt, {\n retries: this.retryConfig.retries,\n onFailedAttempt: (error) => {\n console.warn(\n `Request failed (attempt ${error.attemptNumber}/${error.retriesLeft + 1}): ${error.message}`\n );\n },\n factor: 2,\n minTimeout: this.retryConfig.baseMs,\n maxTimeout: this.retryConfig.baseMs * 8,\n });\n }\n\n async checkConnectivity(): Promise<boolean> {\n try {\n await this.request<RedmineProjectResponse>('/projects.json?limit=1');\n return true;\n } catch (error) {\n if (error instanceof RedmineApiError) {\n throw error;\n }\n throw new RedmineApiError(\n `Connectivity check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async getProject(identifier: string): Promise<RedmineProjectResponse> {\n return this.request<RedmineProjectResponse>(`/projects/${identifier}.json`);\n }\n\n async getIssue(issueId: number, include?: string[]): Promise<RedmineIssueResponse> {\n const params = new URLSearchParams();\n if (include && include.length > 0) {\n params.append('include', include.join(','));\n }\n\n const path = `/issues/${issueId}.json${params.toString() ? `?${params.toString()}` : ''}`;\n return this.request<RedmineIssueResponse>(path);\n }\n\n async getIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n offset?: number;\n include?: string[];\n updatedSince?: string;\n } = {}\n ): Promise<RedmineIssuesResponse> {\n const params = new URLSearchParams();\n params.append('project_id', projectId.toString());\n\n if (options.status && options.status !== '*') {\n params.append('status_id', options.status);\n }\n\n if (options.pageSize) {\n params.append('limit', options.pageSize.toString());\n }\n\n if (options.offset) {\n params.append('offset', options.offset.toString());\n }\n\n if (options.include && options.include.length > 0) {\n params.append('include', options.include.join(','));\n }\n\n if (options.updatedSince) {\n params.append('updated_on', `>=${options.updatedSince}`);\n }\n\n const path = `/issues.json?${params.toString()}`;\n return this.request<RedmineIssuesResponse>(path);\n }\n\n async getAllIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n const allIssues: RedmineIssue[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n allIssues.push(...response.issues);\n\n if (options.onProgress) {\n options.onProgress(allIssues.length, response.total_count);\n }\n\n hasMore = allIssues.length < response.total_count;\n offset += pageSize;\n }\n\n return allIssues;\n }\n\n async getIssuesConcurrently(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n\n // First, get the total count\n const initialResponse = await this.getIssues(projectId, {\n ...options,\n pageSize: 1,\n });\n\n const totalCount = initialResponse.total_count;\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const pagePromises = Array.from({ length: totalPages }, (_, index) => {\n const offset = index * pageSize;\n\n return this.concurrencyLimit(async () => {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n if (options.onProgress) {\n options.onProgress(offset + response.issues.length, totalCount);\n }\n\n return response.issues;\n });\n });\n\n const pageResults = await Promise.all(pagePromises);\n return pageResults.flat();\n }\n}\n","import type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineApiClient, RedmineApiError } from '../api.js';\n\nexport interface ConnectivityResult {\n success: boolean;\n message: string;\n details?: {\n baseUrl: string;\n project?: {\n id: number;\n identifier: string;\n name: string;\n };\n };\n}\n\nexport async function checkConnectivity(config: RedmineConfig): Promise<ConnectivityResult> {\n const client = new RedmineApiClient(config);\n\n try {\n const isConnected = await client.checkConnectivity();\n\n if (!isConnected) {\n return {\n success: false,\n message: 'Failed to connect to Redmine API',\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n const projectResponse = await client.getProject(config.project.identifier);\n\n return {\n success: true,\n message: `Successfully connected to Redmine and found project \"${projectResponse.project.name}\"`,\n details: {\n baseUrl: config.baseUrl,\n project: projectResponse.project,\n },\n };\n } catch (error) {\n if (error instanceof RedmineApiError) {\n let message = `Redmine API error: ${error.message}`;\n\n if (error.status === 401) {\n message = 'Authentication failed - please check your API access token';\n } else if (error.status === 403) {\n message = 'Access forbidden - insufficient permissions for the project';\n } else if (error.status === 404) {\n message = `Project \"${config.project.identifier}\" not found or inaccessible`;\n }\n\n return {\n success: false,\n message,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n return {\n success: false,\n message: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncIssue, extractIssueIdFromUrl } from '../../sync-issue.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface SyncIssueOptions {\n id?: string;\n url?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync issue command\n */\nexport function createSyncIssueCommand(): Command {\n const cmd = new Command('issue')\n .description('Sync a single issue')\n .option('-i, --id <number>', 'Issue ID')\n .option('-u, --url <url>', 'Issue URL')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncIssueOptions) => {\n await handleSyncIssue(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncIssue(options: SyncIssueOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n let issueId: number;\n\n if (options.id) {\n issueId = parseInt(options.id, 10);\n if (isNaN(issueId)) {\n throw new ValidationError('Invalid issue ID');\n }\n } else if (options.url) {\n const extractedId = extractIssueIdFromUrl(options.url);\n if (!extractedId) {\n throw new ValidationError('Could not extract issue ID from URL');\n }\n issueId = extractedId;\n } else {\n throw new ValidationError('Either --id or --url must be provided');\n }\n\n const result = await syncIssue(issueId, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n const icon = result.action === 'skipped' ? '⏭️' : '✅';\n console.log(`${icon} ${result.message}`);\n if (result.filePath) {\n console.log(` File: ${result.filePath}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { resolve, relative } from 'node:path';\nimport type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport {\n mapIssueToFrontmatter,\n mapIssueToContent,\n mapJournalsToComments,\n extractNewJournals,\n shouldUpdateIssue,\n shouldUpdateComments,\n} from './mappers.js';\nimport { generateFilename } from './slug.util.js';\nimport {\n readMarkdownFile,\n writeMarkdownFile,\n extractIssueIdFromFrontmatter,\n extractLastJournalId,\n} from './file.util.js';\n\nexport interface SyncIssueOptions {\n dryRun?: boolean;\n outputDir?: string;\n}\n\nexport interface SyncIssueResult {\n success: boolean;\n issueId: number;\n filename: string;\n filePath: string;\n action: 'created' | 'updated' | 'skipped';\n message: string;\n changes?: {\n content?: boolean;\n comments?: boolean;\n frontmatter?: boolean;\n };\n}\n\nexport async function syncIssue(\n issueId: number,\n config: RedmineConfig,\n options: SyncIssueOptions = {}\n): Promise<SyncIssueResult> {\n const client = new RedmineApiClient(config);\n const outputDir = options.outputDir || config.outputDir;\n\n try {\n const include = config.defaults.include;\n const response = await client.getIssue(issueId, include);\n const issue = response.issue;\n\n const filename = generateFilename(issue.id, issue.subject, config.filename);\n const filePath = resolve(outputDir, filename);\n const relativePath = relative(process.cwd(), filePath);\n\n const existingFile = await readMarkdownFile(filePath);\n const existingIssueId = extractIssueIdFromFrontmatter(existingFile.frontmatter);\n const existingLastJournalId = extractLastJournalId(existingFile.frontmatter);\n\n if (existingIssueId && existingIssueId !== issue.id) {\n return {\n success: false,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `File ${filename} contains issue ${existingIssueId}, not ${issue.id}`,\n };\n }\n\n const needsUpdate = shouldUpdateIssue(issue, existingFile.frontmatter);\n const needsCommentsUpdate = shouldUpdateComments(\n issue.journals || [],\n existingFile.frontmatter\n );\n\n if (!needsUpdate && !needsCommentsUpdate) {\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `Issue ${issueId} is already up to date`,\n };\n }\n\n const frontmatter = mapIssueToFrontmatter(issue);\n const content = mapIssueToContent(issue);\n\n let comments: string | undefined;\n if (needsCommentsUpdate && issue.journals) {\n const newJournals = extractNewJournals(issue.journals, existingLastJournalId);\n if (newJournals.length > 0) {\n const newComments = mapJournalsToComments(newJournals, config.comments);\n if (existingFile.comments) {\n comments = `${existingFile.comments}\\n\\n---\\n\\n${newComments}`;\n } else {\n comments = newComments;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n\n const changes: SyncIssueResult['changes'] = {};\n if (needsUpdate) {\n changes.frontmatter = true;\n changes.content = true;\n }\n if (needsCommentsUpdate) {\n changes.comments = true;\n }\n\n if (options.dryRun) {\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Would ${action} issue ${issueId} (dry run)`,\n changes,\n };\n }\n\n await writeMarkdownFile(\n filePath,\n {\n frontmatter,\n content,\n comments,\n },\n config.comments\n );\n\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Successfully ${action} issue ${issueId}`,\n changes,\n };\n } catch (error) {\n return {\n success: false,\n issueId,\n filename: '',\n filePath: '',\n action: 'skipped',\n message: `Failed to sync issue ${issueId}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport function extractIssueIdFromUrl(url: string): number | null {\n const match = url.match(/\\/issues\\/(\\d+)(?:\\/|$)/);\n if (match) {\n const issueId = parseInt(match[1], 10);\n return isNaN(issueId) ? null : issueId;\n }\n return null;\n}\n","import type { RedmineIssue, RedmineJournal } from './api.js';\nimport type { CommentsConfig } from './config.js';\n\nexport interface IssueFrontmatter {\n id: number;\n subject: string;\n status: string;\n priority: string;\n author: string;\n assigned_to?: string;\n created_on: string;\n updated_on: string;\n project: string;\n tracker: string;\n lastJournalId?: number;\n relations?: Array<{\n type: string;\n issue_id: number;\n delay?: number;\n }>;\n attachments?: Array<{\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: string;\n created_on: string;\n content_url?: string;\n }>;\n}\n\nexport function mapIssueToFrontmatter(issue: RedmineIssue): IssueFrontmatter {\n const frontmatter: IssueFrontmatter = {\n id: issue.id,\n subject: issue.subject,\n status: issue.status.name,\n priority: issue.priority.name,\n author: issue.author.name,\n created_on: issue.created_on,\n updated_on: issue.updated_on,\n project: issue.project.name,\n tracker: issue.tracker.name,\n };\n\n if (issue.assigned_to) {\n frontmatter.assigned_to = issue.assigned_to.name;\n }\n\n if (issue.relations && issue.relations.length > 0) {\n frontmatter.relations = issue.relations.map((relation) => ({\n type: relation.relation_type,\n issue_id: relation.issue_to_id,\n delay: relation.delay,\n }));\n }\n\n if (issue.attachments && issue.attachments.length > 0) {\n frontmatter.attachments = issue.attachments.map((attachment) => ({\n id: attachment.id,\n filename: attachment.filename,\n filesize: attachment.filesize,\n content_type: attachment.content_type,\n author: attachment.author.name,\n created_on: attachment.created_on,\n content_url: attachment.content_url,\n }));\n }\n\n if (issue.journals && issue.journals.length > 0) {\n const lastJournal = issue.journals.reduce((latest, journal) =>\n journal.id > latest.id ? journal : latest\n );\n frontmatter.lastJournalId = lastJournal.id;\n }\n\n return frontmatter;\n}\n\nexport function mapIssueToContent(issue: RedmineIssue): string {\n let content = '';\n\n if (issue.description) {\n content += issue.description;\n }\n\n return content;\n}\n\nexport function mapJournalsToComments(journals: RedmineJournal[], config: CommentsConfig): string {\n if (!journals || journals.length === 0) {\n return '';\n }\n\n let comments = '';\n\n const sortedJournals = [...journals].sort((a, b) => {\n if (config.trackBy === 'journalId') {\n return a.id - b.id;\n }\n return new Date(a.created_on).getTime() - new Date(b.created_on).getTime();\n });\n\n for (const journal of sortedJournals) {\n if (!journal.notes || journal.notes.trim() === '') {\n continue;\n }\n\n const date = new Date(journal.created_on).toISOString().split('T')[0];\n const time = new Date(journal.created_on).toTimeString().split(' ')[0].substring(0, 5);\n\n comments += `## ${journal.user.name} - ${date} ${time}\\n\\n`;\n comments += `${journal.notes}\\n\\n`;\n\n if (journal.details && journal.details.length > 0) {\n comments += '**Changes:**\\n';\n for (const detail of journal.details) {\n const oldValue = detail.old_value || '(none)';\n const newValue = detail.new_value || '(none)';\n comments += `- ${detail.name}: ${oldValue} → ${newValue}\\n`;\n }\n comments += '\\n';\n }\n\n comments += '---\\n\\n';\n }\n\n return comments.trim();\n}\n\nexport function extractNewJournals(\n allJournals: RedmineJournal[],\n lastJournalId: number | null\n): RedmineJournal[] {\n if (!lastJournalId) {\n return allJournals;\n }\n\n return allJournals.filter((journal) => journal.id > lastJournalId);\n}\n\nexport function shouldUpdateIssue(\n remoteIssue: RedmineIssue,\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localUpdatedOn = localFrontmatter.updated_on as string;\n const remoteUpdatedOn = remoteIssue.updated_on;\n\n if (!localUpdatedOn) {\n return true;\n }\n\n return new Date(remoteUpdatedOn) > new Date(localUpdatedOn);\n}\n\nexport function shouldUpdateComments(\n remoteJournals: RedmineJournal[],\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localLastJournalId = localFrontmatter.lastJournalId as number;\n\n if (!localLastJournalId) {\n return remoteJournals.length > 0;\n }\n\n return remoteJournals.some((journal) => journal.id > localLastJournalId);\n}\n","import slugify from 'slugify';\nimport type { FilenameConfig } from './config.js';\n\nexport function generateSlug(\n title: string,\n config: FilenameConfig['slug'],\n existingSlugs: Set<string> = new Set()\n): string {\n let slug = slugify(title, {\n lower: config.lowercase,\n strict: true,\n remove: /[^\\w\\s-]/g,\n });\n\n slug = slug.substring(0, config.maxLength);\n\n if (!config.dedupe) {\n return slug;\n }\n\n let finalSlug = slug;\n let counter = 1;\n\n while (existingSlugs.has(finalSlug)) {\n const suffix = `-${counter}`;\n const maxLength = config.maxLength - suffix.length;\n finalSlug = `${slug.substring(0, maxLength)}${suffix}`;\n counter++;\n }\n\n existingSlugs.add(finalSlug);\n return finalSlug;\n}\n\nexport function generateFilename(\n issueId: number,\n title: string,\n config: FilenameConfig,\n existingSlugs: Set<string> = new Set()\n): string {\n const slug = generateSlug(title, config.slug, existingSlugs);\n\n return config.pattern.replace('{issueId}', issueId.toString()).replace('{slug}', slug);\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport matter from 'gray-matter';\nimport type { CommentsConfig } from './config.js';\n\nexport interface MarkdownData {\n frontmatter: Record<string, unknown>;\n content: string;\n comments?: string;\n}\n\nexport interface ParsedMarkdown {\n frontmatter: Record<string, unknown>;\n content: string;\n comments: string | null;\n rawContent: string;\n}\n\nexport async function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n}\n\nexport async function readMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return parseMarkdownContent(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: '',\n };\n }\n throw error;\n }\n}\n\nexport function parseMarkdownContent(content: string): ParsedMarkdown {\n if (!content.trim()) {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: content,\n };\n }\n\n const { data: frontmatter, content: body } = matter(content);\n\n const comments = extractCommentsSection(body);\n const mainContent = removeCommentsSection(body);\n\n return {\n frontmatter,\n content: mainContent,\n comments,\n rawContent: content,\n };\n}\n\nexport function extractCommentsSection(content: string): string | null {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return null;\n }\n\n const startIndex = content.indexOf(startMatch[0]) + startMatch[0].length;\n const endIndex = content.indexOf(endMatch[0]);\n\n if (startIndex >= endIndex) {\n return null;\n }\n\n return content.substring(startIndex, endIndex).trim();\n}\n\nexport function removeCommentsSection(content: string): string {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return content;\n }\n\n const startIndex = content.indexOf(startMatch[0]);\n const endIndex = content.indexOf(endMatch[0]) + endMatch[0].length;\n\n return content.substring(0, startIndex) + content.substring(endIndex).trim();\n}\n\nexport function buildMarkdownContent(data: MarkdownData, config: CommentsConfig): string {\n let content = '';\n\n if (Object.keys(data.frontmatter).length > 0) {\n const frontmatterYaml = matter.stringify('', data.frontmatter).replace(/^---\\n|\\n---\\n?$/g, '');\n content += `---\\n${frontmatterYaml}---\\n\\n`;\n }\n\n content += data.content;\n\n if (data.comments) {\n content += `\\n\\n${config.anchors.start}\\n${data.comments}\\n${config.anchors.end}`;\n }\n\n return content;\n}\n\nexport async function writeMarkdownFile(\n filePath: string,\n data: MarkdownData,\n config: CommentsConfig\n): Promise<void> {\n await ensureDir(filePath);\n const content = buildMarkdownContent(data, config);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function extractIssueIdFromFrontmatter(frontmatter: Record<string, unknown>): number | null {\n const id = frontmatter.id as number | string | undefined;\n if (typeof id === 'number') {\n return id;\n }\n if (typeof id === 'string') {\n const parsed = parseInt(id, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\nexport function extractLastJournalId(frontmatter: Record<string, unknown>): number | null {\n const lastJournalId = frontmatter.lastJournalId as number | string | undefined;\n if (typeof lastJournalId === 'number') {\n return lastJournalId;\n }\n if (typeof lastJournalId === 'string') {\n const parsed = parseInt(lastJournalId, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncProject } from '../../sync-project.js';\n\ninterface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n concurrency?: string;\n pageSize?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync project command\n */\nexport function createSyncProjectCommand(): Command {\n const cmd = new Command('project')\n .description('Sync all issues in a project')\n .option('-s, --status <status>', 'Filter by status (default: *)', '*')\n .option('--updated-since <date>', 'Only sync issues updated since YYYY-MM-DD')\n .option('--concurrency <number>', 'Number of concurrent requests')\n .option('--page-size <number>', 'Page size for API requests')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncProjectOptions) => {\n await handleSyncProject(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncProject(options: SyncProjectOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const syncOptions: Parameters<typeof syncProject>[1] = {\n status: options.status,\n updatedSince: options.updatedSince,\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n ...(options.concurrency && { concurrency: parseInt(options.concurrency, 10) }),\n ...(options.pageSize && { pageSize: parseInt(options.pageSize, 10) }),\n onProgress: options.json\n ? undefined\n : (current: number, total: number) => {\n process.stdout.write(`\\rProgress: ${current}/${total} issues`);\n },\n };\n\n const result = await syncProject(config, syncOptions);\n\n if (!options.json) {\n process.stdout.write('\\r'); // Clear progress line\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅ Sync completed successfully');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n if (result.failed > 0) {\n console.log(` Failed: ${result.failed}`);\n }\n } else {\n console.log('❌ Sync completed with errors');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n console.log(` Failed: ${result.failed}`);\n\n if (result.errors.length > 0) {\n console.log('\\nErrors:');\n result.errors.forEach((error) => {\n console.log(` Issue ${error.issueId}: ${error.error}`);\n });\n }\n\n process.exit(5);\n }\n }\n}\n","import type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport { syncIssue } from './sync-issue.js';\n\nexport interface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n dryRun?: boolean;\n outputDir?: string;\n concurrency?: number;\n pageSize?: number;\n onProgress?: (current: number, total: number) => void;\n}\n\nexport interface SyncProjectResult {\n success: boolean;\n totalIssues: number;\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n errors: Array<{\n issueId: number;\n error: string;\n }>;\n}\n\nexport async function syncProject(\n config: RedmineConfig,\n options: SyncProjectOptions = {}\n): Promise<SyncProjectResult> {\n const client = new RedmineApiClient(config);\n const pageSize = options.pageSize || config.defaults.pageSize;\n\n const result: SyncProjectResult = {\n success: true,\n totalIssues: 0,\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n failed: 0,\n errors: [],\n };\n\n try {\n const issues = await client.getIssuesConcurrently(config.project.id, {\n status: options.status || config.defaults.status,\n pageSize,\n include: config.defaults.include,\n updatedSince: options.updatedSince,\n onProgress: options.onProgress,\n });\n\n result.totalIssues = issues.length;\n\n if (issues.length === 0) {\n return result;\n }\n\n const syncPromises = issues.map(async (issue) => {\n const syncResult = await syncIssue(issue.id, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n result.processed++;\n\n if (syncResult.success) {\n switch (syncResult.action) {\n case 'created':\n result.created++;\n break;\n case 'updated':\n result.updated++;\n break;\n case 'skipped':\n result.skipped++;\n break;\n }\n } else {\n result.failed++;\n result.errors.push({\n issueId: syncResult.issueId,\n error: syncResult.message,\n });\n }\n\n return syncResult;\n });\n\n await Promise.all(syncPromises);\n\n result.success = result.failed === 0;\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push({\n issueId: 0,\n error: `Failed to fetch issues: ${error instanceof Error ? error.message : String(error)}`,\n });\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../../types/framework.types.js';\n\n/**\n * Create info command for Jai1 Framework\n * Shows configuration and status information\n */\nexport function createInfoCommand(): Command {\n const cmd = new Command('info')\n .description('Show jai1-client configuration and status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleInfo(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('Jai1 Client Info');\n console.log('────────────────\\n');\n console.log(`Config Location: ${info.configPath}`);\n console.log(`API URL: ${info.apiUrl}`);\n console.log(`Access Key: ${info.accessKey}`);\n console.log(`Framework Version: ${info.version}`);\n console.log(`Last Updated: ${info.lastUpdated}`);\n console.log(`Framework Location: ${info.frameworkPath}`);\n console.log();\n console.log('Project Status:');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Synced version: ${info.projectStatus.version || 'Unknown'}`);\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create self-update command\n */\nexport function createSelfUpdateCommand(): Command {\n return new Command('self-update')\n .description('Update jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force update without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleSelfUpdate(options);\n });\n}\n\nasync function handleSelfUpdate(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 self-update\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Update cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully updated to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('self_update', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Update failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually updating with:${colors.reset}`);\n console.error(` ${colors.cyan}npm install -g @jvittechs/jai1-cli@latest${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager is being used\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check user agent for package manager\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Check which command is available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n try {\n execSync('bun --version', { stdio: 'ignore' });\n return 'bun';\n } catch {\n // bun not available\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\n\nexport function createClearBackupsCommand(): Command {\n return new Command('clear-backups')\n .description('Clear backup files')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const service = new ComponentsService();\n const backups = await service.listBackups(process.cwd());\n\n if (backups.length === 0) {\n console.log('No backups found.');\n return;\n }\n\n console.log(`Found ${backups.length} backup(s):`);\n if (backups.length <= 5) {\n backups.forEach(b => console.log(` - ${b}`));\n } else {\n backups.slice(0, 5).forEach(b => console.log(` - ${b}`));\n console.log(` ...and ${backups.length - 5} more`);\n }\n console.log();\n\n if (!options.yes) {\n const ok = await confirm({ message: 'Delete all backups?', default: false });\n if (!ok) return;\n }\n\n await service.clearBackups(process.cwd());\n console.log('✅ Backups cleared.');\n });\n}\n","import { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Tắt tất cả telemetry và thu thập dữ liệu',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Tắt/giảm tải các language servers (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Tắt Git tích hợp để cải thiện hiệu suất',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Loại trừ các thư mục khỏi file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Loại trừ các thư mục khỏi search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Tắt auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Tối ưu rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Ẩn các UI elements không cần thiết',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\nexport function createVSCodeCommand(): Command {\n const vscodeCommand = new Command('vscode')\n .description('Quản lý cài đặt VSCode cho dự án hiện tại');\n\n // Interactive mode (default)\n vscodeCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n vscodeCommand\n .command('enable')\n .description('Enable các nhóm tối ưu cụ thể')\n .argument('[groups...]', 'Tên các nhóm cần enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n vscodeCommand\n .command('disable')\n .description('Disable các nhóm tối ưu cụ thể (restore về default)')\n .argument('[groups...]', 'Tên các nhóm cần disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n vscodeCommand\n .command('max-performance')\n .description('Enable tất cả các tối ưu để đạt hiệu suất tối đa')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n vscodeCommand\n .command('reset')\n .description('Reset về settings mặc định (xóa tất cả tối ưu)')\n .argument('[groups...]', 'Tên các nhóm cần reset (để trống = reset tất cả)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n vscodeCommand\n .command('list')\n .description('Liệt kê tất cả các nhóm tối ưu có sẵn')\n .action(() => {\n console.log('🔧 Các nhóm tối ưu có sẵn:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return vscodeCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 Quản lý cài đặt VSCode\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Hướng dẫn sử dụng: │');\n console.log('│ • Dùng phím ↑↓ để di chuyển │');\n console.log('│ • Nhấn SPACE để chọn/bỏ chọn nhóm │');\n console.log('│ • Nhấn ENTER để xác nhận và áp dụng │');\n console.log('│ • Nhấn Ctrl+C để hủy │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'Bạn muốn làm gì?',\n choices: [\n { name: '✅ Enable các nhóm tối ưu', value: 'enable' },\n { name: '❌ Disable các nhóm tối ưu', value: 'disable' },\n { name: '🚀 Max Performance (enable tất cả)', value: 'max' },\n { name: '🔄 Reset về mặc định', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Chọn các nhóm để ${action === 'enable' ? 'enable' : 'disable'} (SPACE để chọn, ENTER để xác nhận):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn nhóm nào!');\n console.log(' 💡 Mẹo: Hãy nhấn SPACE để chọn ít nhất 1 nhóm trước khi nhấn ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Đã hủy thao tác.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Nhóm không hợp lệ: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Chạy \"jai1 vscode list\" để xem danh sách nhóm có sẵn.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Đã tạo thư mục .vscode/');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Đã đọc cài đặt hiện tại từ settings.json');\n } catch {\n console.warn('⚠️ Không thể đọc settings.json (có thể chứa comments).');\n const confirmOverwrite = await confirm({\n message: 'Ghi đè file settings.json hiện tại?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 Đang ${action === 'enable' ? 'enable' : 'disable'} các nhóm:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Đã cập nhật cài đặt VSCode tại: ${settingsPath}`);\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ Không tìm thấy file settings.json');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset TẤT CẢ settings về mặc định (xóa toàn bộ file)?'\n : `Reset các nhóm: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Đã xóa file settings.json');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create guide command - Agentic Coding guide center\n */\nexport function createGuideCommand(): Command {\n const cmd = new Command('guide')\n .description('Interactive guide center for Agentic Coding')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../types/context.types.js';\nimport { ContextScannerService } from '../services/context-scanner.service.js';\n\n/**\n * Create context command - Visualize project context\n */\nexport function createContextCommand(): Command {\n const cmd = new Command('context')\n .description('Khám phá và quản lý context dự án cho các IDE')\n .option('--ide <ide>', 'Mở trực tiếp IDE cụ thể (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Hiển thị loại context cụ thể (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Hiển thị thống kê context (non-interactive)')\n .action(async (options: { ide?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.ide) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.ide)) {\n console.error(`❌ IDE không hợp lệ: ${options.ide}`);\n console.error(` IDE hợp lệ: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.ide as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Loại context không hợp lệ: ${options.type}`);\n console.error(` Loại hợp lệ: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Đang quét context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ Không tìm thấy context nào');\n console.log(' Hãy chạy `jai1 apply` để cài đặt context cho IDE của bạn.\\n');\n return;\n }\n\n console.log('📊 Thống kê Context\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('vi-VN')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Tổng: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Lỗi khi quét context:', error);\n process.exit(1);\n }\n}\n","/**\n * migrate-ide command - Migrate .jai1 content to IDE directories\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../constants/ide-migration-configs.js';\n\n/**\n * Create migrate-ide command\n */\nexport function createMigrateIdeCommand(): Command {\n const cmd = new Command('migrate-ide')\n .description('Migrate .jai1 rules và workflows sang IDEs (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runMigrateIde(options);\n });\n\n return cmd;\n}\n\nasync function runMigrateIde(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Migrate rules và workflows sang IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ Không tìm thấy content trong .jai1/');\n console.log(' 💡 Hãy tạo files trong .jai1/rules/ hoặc .jai1/workflows/ trước.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Chọn IDE(s) để migrate (SPACE để chọn, ENTER để xác nhận):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn IDE nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Chọn content types để migrate:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn content type nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with migration?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Migration cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Migrating...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Migration complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n"],"mappings":"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","names":["Command","homedir","homedir","resolve","Command","fs","join","homedir","join","homedir","fs","fs","join","homedir","Command","React","Command","React","Box","Text","React","Text","React","Text","input","React","Box","Text","Command","React","Command","Command","Command","Command","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","fs","fs","useApp","useState","useEffect","useInput","input","React","Box","Text","Command","render","React","Command","confirm","fs","path","Command","checkbox","confirm","fs","path","matter","path","fs","matter","Command","checkbox","confirm","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","input","React","React","Box","Text","React","React","React","React","React","React","React","React","React","React","useState","Box","Text","useInput","TextInput","Spinner","input","resolve","useApp","useState","useEffect","useInput","input","React","Box","Text","Command","render","React","Command","React","render","React","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","useApp","Spinner","useState","useState","useEffect","useCallback","React","memo","Box","Text","Spinner","React","Box","Text","React","memo","Box","Text","TextInput","memo","React","Box","Text","Spinner","React","useState","Box","Text","useInput","input","useApp","useRef","useState","useEffect","useMemo","useCallback","useInput","input","React","Box","Text","Spinner","render","React","Command","Command","maskKey","Command","Command","Command","Command","fs","path","input","input","Command","Command","Command","input","Command","Command","Command","Command","input","Command","Command","readFile","input","readFile","Command","Command","readFile","input","readFile","Command","Command","readFile","readFile","Command","Command","Command","Command","input","Command","Command","Command","Command","input","Command","Command","input","Command","Command","Command","readFile","React","render","React","useState","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","fs","path","input","marked","MENU_ITEMS","useState","useApp","useInput","input","React","Box","Text","resolve","render","React","Command","Command","Command","fs","join","join","fs","Command","Command","Command","Command","fs","join","select","checkbox","execa","Command","execa","join","fs","select","checkbox","Command","Command","confirm","colors","Command","isNewerVersion","confirm","packageManager","Command","confirm","select","join","Command","select","confirm","Command","readFile","resolve","z","resolve","readFile","z","fetch","pRetry","pLimit","path","Command","Command","resolve","readFile","writeFile","matter","resolve","action","Command","Command","Command","Command","fs","join","homedir","Command","getProjectStatus","maskKey","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","detectPackageManager","getInstallCommand","execSync","Command","confirm","Command","confirm","Command","checkbox","confirm","select","fs","path","existsSync","PERFORMANCE_GROUPS","interactiveMode","selectGroupsToApply","applyGroups","resetSettings","React","render","Command","Command","render","React","React","render","Command","Command","printStats","render","React","Command","checkbox","confirm","Command","checkbox","confirm","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors/index.ts","../package.json","../src/services/config.service.ts","../src/services/version-check.service.ts","../src/commands/framework/auth.ts","../src/services/tracking.service.ts","../src/commands/status.ts","../src/services/components.service.ts","../src/commands/apply.ts","../src/ui/apply/UnifiedApplyApp.tsx","../src/ui/shared/ProgressBar.tsx","../src/ui/shared/StatusIcon.tsx","../src/ui/shared/theme.ts","../src/commands/update.ts","../src/commands/framework/check.ts","../src/commands/ide/index.ts","../src/commands/ide/context.ts","../src/ui/context/ContextApp.tsx","../src/ui/context/views/MainMenuView.tsx","../src/ui/context/views/IDEOverviewView.tsx","../src/ui/context/views/ListView.tsx","../src/ui/context/views/DetailView.tsx","../src/services/context-scanner.service.ts","../src/constants/ide-configs.ts","../src/commands/ide/setup.ts","../src/commands/ide/sync.ts","../src/services/migrate-ide.service.ts","../src/constants/ide-migration-configs.ts","../src/commands/learn.ts","../src/ui/guide/GuideApp.tsx","../src/ui/guide/views/MenuView.tsx","../src/ui/guide/views/IntroView.tsx","../src/ui/guide/components/ContentView.tsx","../src/ui/guide/views/RulesView.tsx","../src/ui/guide/views/WorkflowsView.tsx","../src/ui/guide/views/PromptsView.tsx","../src/ui/guide/views/SkillsView.tsx","../src/ui/guide/views/AgenticGuideView.tsx","../src/commands/chat.ts","../src/services/llm-proxy.service.ts","../src/ui/llm/LlmApp.tsx","../src/ui/llm/hooks/useChat.ts","../src/ui/llm/hooks/useLlmApi.ts","../src/ui/llm/components/ChatPanel.tsx","../src/ui/llm/components/MessageItem.tsx","../src/ui/llm/components/InputBox.tsx","../src/ui/llm/components/ModelSelector.tsx","../src/commands/openai-keys.ts","../src/commands/stats.ts","../src/commands/translate.ts","../src/services/translation.service.ts","../src/commands/utils/index.ts","../src/commands/utils/password.ts","../src/services/utils.service.ts","../src/commands/utils/uuid.ts","../src/commands/utils/hash.ts","../src/commands/utils/base64-encode.ts","../src/commands/utils/base64-decode.ts","../src/commands/utils/http.ts","../src/commands/utils/jwt.ts","../src/commands/utils/unix-time.ts","../src/commands/utils/timezone.ts","../src/commands/utils/url-encode.ts","../src/commands/utils/url-decode.ts","../src/commands/utils/cron.ts","../src/commands/utils/markdown-preview.ts","../src/commands/utils/interactive.ts","../src/ui/utils/UtilsApp.tsx","../src/ui/utils/views/PasswordView.tsx","../src/ui/utils/views/UuidView.tsx","../src/ui/utils/views/HashView.tsx","../src/ui/utils/views/Base64View.tsx","../src/ui/utils/views/UrlView.tsx","../src/ui/utils/views/UnixTimeView.tsx","../src/ui/utils/views/JwtView.tsx","../src/ui/utils/views/CronView.tsx","../src/ui/utils/views/TimezoneView.tsx","../src/ui/utils/views/HttpView.tsx","../src/ui/utils/views/MarkdownView.tsx","../src/commands/deps/index.ts","../src/commands/deps/upgrade.ts","../src/services/deps.service.ts","../src/commands/kit/index.ts","../src/commands/kit/list.ts","../src/services/starter-kit.service.ts","../src/commands/kit/info.ts","../src/commands/kit/create.ts","../src/services/hook-executor.service.ts","../src/commands/rules/index.ts","../src/commands/rules/list.ts","../src/commands/rules/init.ts","../src/commands/rules/sync.ts","../src/commands/rules/info.ts","../src/commands/upgrade.ts","../src/commands/clean.ts","../src/commands/redmine/check.ts","../src/services/redmine-config.service.ts","../src/types/redmine.types.ts","../src/api.ts","../src/services/redmine-connectivity.service.ts","../src/commands/redmine/sync-issue.ts","../src/sync-issue.ts","../src/mappers.ts","../src/slug.util.ts","../src/file.util.ts","../src/commands/redmine/sync-project.ts","../src/sync-project.ts","../src/commands/framework/info.ts","../src/commands/self-update.ts","../src/commands/clear-backups.ts","../src/commands/vscode/index.ts","../src/commands/guide.ts","../src/commands/context.ts","../src/commands/migrate-ide.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { Jai1Error } from './errors/index.js';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { checkForClientUpdate } from './services/version-check.service.js';\n\n// ============================================\n// SETUP & AUTH COMMANDS\n// ============================================\nimport { createAuthCommand } from './commands/framework/auth.js';\nimport { createStatusCommand } from './commands/status.js';\n\n// ============================================\n// COMPONENT MANAGEMENT COMMANDS\n// ============================================\nimport { createApplyCommand } from './commands/apply.js';\nimport { createUpdateCommand } from './commands/update.js';\nimport { createCheckCommand } from './commands/framework/check.js';\n\n// ============================================\n// IDE COMMANDS (grouped)\n// ============================================\nimport { createIdeCommand } from './commands/ide/index.js';\n\n// ============================================\n// LEARNING COMMAND\n// ============================================\nimport { createLearnCommand } from './commands/learn.js';\n\n// ============================================\n// LLM PROXY COMMAND\n// ============================================\nimport { createChatCommand } from './commands/chat.js';\nimport { createOpenAiKeysCommand } from './commands/openai-keys.js';\nimport { createStatsCommand } from './commands/stats.js';\nimport { createTranslateCommand } from './commands/translate.js';\n\n// ============================================\n// DEVELOPER UTILITIES\n// ============================================\nimport { createUtilsCommand } from './commands/utils/index.js';\nimport { createDepsCommand } from './commands/deps/index.js';\n\n// ============================================\n// STARTER KITS\n// ============================================\nimport { createKitCommand } from './commands/kit/index.js';\n// ============================================\nimport { createRulesCommand } from './commands/rules/index.js';\n\n\n\n// ============================================\n// MAINTENANCE COMMANDS\n// ============================================\nimport { createUpgradeCommand } from './commands/upgrade.js';\nimport { createCleanCommand } from './commands/clean.js';\n\n// ============================================\n// EXTERNAL INTEGRATIONS\n// ============================================\nimport { createRedmineCheckCommand } from './commands/redmine/check.js';\nimport { createSyncIssueCommand } from './commands/redmine/sync-issue.js';\nimport { createSyncProjectCommand } from './commands/redmine/sync-project.js';\n\n// ============================================\n// LEGACY ALIASES (for backward compatibility)\n// ============================================\nimport { createInfoCommand } from './commands/framework/info.js';\nimport { createSelfUpdateCommand } from './commands/self-update.js';\nimport { createClearBackupsCommand } from './commands/clear-backups.js';\nimport { createVSCodeCommand } from './commands/vscode/index.js';\nimport { createGuideCommand } from './commands/guide.js';\nimport { createContextCommand } from './commands/context.js';\nimport { createMigrateIdeCommand } from './commands/migrate-ide.js';\n\nconst program = new Command();\n\n// Manual version check to support update checking\nif (process.argv.includes('-v') || process.argv.includes('--version')) {\n console.log(packageJson.version);\n // Check for updates\n if (!process.argv.includes('--skip-update-check')) {\n await checkForClientUpdate();\n }\n process.exit(0);\n}\n\nprogram\n .name('jai1')\n .description('Jai1 Framework Management CLI')\n// .version() removed to custom handle update check (handled above)\n\n// Global options\nprogram\n // .option('-v, --version', 'output the version number') // Handled manually\n .option('--verbose', 'Enable verbose logging')\n .option('--json', 'Output results as JSON')\n .option('--skip-update-check', 'Skip checking for client updates');\n\n// ============================================\n// 🔧 SETUP & INFO\n// ============================================\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createStatusCommand());\n\n// ============================================\n// 📦 COMPONENT MANAGEMENT\n// ============================================\nprogram.addCommand(createApplyCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createCheckCommand());\n\n// ============================================\n// 🖥️ IDE INTEGRATION (grouped)\n// ============================================\nprogram.addCommand(createIdeCommand());\n\n// ============================================\n// 📚 LEARNING\n// ============================================\nprogram.addCommand(createLearnCommand());\n\n// ============================================\n// 🤖 LLM PROXY\n// ============================================\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createOpenAiKeysCommand());\nprogram.addCommand(createStatsCommand());\nprogram.addCommand(createTranslateCommand());\n\n// ============================================\n// 🛠️ DEVELOPER UTILITIES\n// ============================================\nprogram.addCommand(createUtilsCommand());\nprogram.addCommand(createDepsCommand());\n\n// ============================================\n// 📦 STARTER KITS\n// ============================================\nprogram.addCommand(createKitCommand());\n// ============================================\n// 📋 RULE PRESETS\n// ============================================\nprogram.addCommand(createRulesCommand());\n\n\n// ============================================\n// 🔧 MAINTENANCE\n// ============================================\nprogram.addCommand(createUpgradeCommand());\nprogram.addCommand(createCleanCommand());\n\n// ============================================\n// 🔗 EXTERNAL INTEGRATIONS\n// ============================================\nconst redmineCommand = new Command('redmine')\n .description('Redmine context sync commands');\n\nredmineCommand.addCommand(createRedmineCheckCommand());\n\nconst syncCommand = new Command('sync')\n .description('Sync Redmine issues to markdown files');\n\nsyncCommand.addCommand(createSyncIssueCommand());\nsyncCommand.addCommand(createSyncProjectCommand());\n\nredmineCommand.addCommand(syncCommand);\n\nprogram.addCommand(redmineCommand);\n\n// ============================================\n// 🔄 LEGACY ALIASES (backward compatibility)\n// Hidden from help, but still work\n// ============================================\n\n\n// Legacy: info -> status\nprogram.addCommand(createInfoCommand(), { hidden: true });\n\n// Legacy: self-update -> upgrade\nprogram.addCommand(createSelfUpdateCommand(), { hidden: true });\n\n// Legacy: clear-backups -> clean\nprogram.addCommand(createClearBackupsCommand(), { hidden: true });\n\n// Legacy: vscode -> ide setup\nprogram.addCommand(createVSCodeCommand(), { hidden: true });\n\n// Legacy: guide -> learn\nprogram.addCommand(createGuideCommand(), { hidden: true });\n\n// Legacy: context -> ide context\nprogram.addCommand(createContextCommand(), { hidden: true });\n\n// Legacy: migrate-ide -> ide sync\nprogram.addCommand(createMigrateIdeCommand(), { hidden: true });\n\n\n// Handle unknown commands\nprogram.on('command:*', (operands) => {\n console.error(`❌ Unknown command: ${operands[0]}`);\n console.error('\\nAvailable commands:');\n console.error('');\n console.error(' 🔧 Setup & Info');\n console.error(' auth Authenticate and configure jai1-client');\n console.error(' status Show configuration and installed components');\n console.error('');\n console.error(' 📦 Components');\n console.error(' apply Install/apply components (interactive UI)');\n console.error(' update Update installed components');\n console.error(' check Check for component updates');\n console.error('');\n console.error(' 🖥️ IDE');\n console.error(' ide context Browse and explore IDE context');\n console.error(' ide setup Configure IDE settings');\n console.error(' ide sync Sync .jai1 content to IDEs');\n console.error('');\n console.error(' 📚 Learning');\n console.error(' learn Interactive Agentic Coding guide');\n console.error('');\n console.error(' 🤖 LLM Proxy');\n console.error(' chat Interactive AI chat');\n console.error(' openai-keys Show OpenAI-compatible API credentials');\n console.error(' stats Show LLM usage statistics and limits');\n console.error(' translate Translate text, files, or folders using AI');\n console.error('');\n console.error(' 🛠️ Developer Utilities');\n console.error(' deps Manage project dependencies');\n console.error(' utils Developer tools (password, uuid, hash, jwt, etc.)');\n console.error('');\n console.error(' 📋 Rule Presets');\n console.error(' rules list List available rule presets');\n console.error(' rules init Apply preset to project');\n console.error(' rules sync Regenerate outputs after editing');\n console.error(' rules info Show current preset information');\n console.error('');\n console.error(' 🔧 Maintenance');\n console.error(' upgrade Upgrade jai1-client to latest version');\n console.error(' clean Clean up backups and cache');\n console.error('');\n console.error(' 🔗 Integrations');\n console.error(' redmine Redmine integration commands');\n console.error('');\n console.error('Use \"jai1 --help\" for more information.');\n process.exit(1);\n});\n\n// Error handling\nprocess.on('unhandledRejection', (error) => {\n if (error instanceof Jai1Error) {\n console.error('❌', error.message);\n process.exit(error.exitCode);\n } else if (error instanceof Error) {\n console.error('❌ Unexpected error:', error.message);\n if (program.opts().verbose) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).then(async () => {\n const opts = program.opts();\n\n // Check for client updates after command execution (unless skipped)\n if (!opts.skipUpdateCheck) {\n await checkForClientUpdate();\n }\n}).catch((error) => {\n console.error('❌', error.message);\n process.exit(1);\n});\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n","{\n \"name\": \"@jvittechs/jai1-cli\",\n \"version\": \"0.1.86\",\n \"description\": \"A unified CLI tool for JV-IT TECHS developers to manage Jai1 Framework. Please contact TeamAI for usage instructions.\",\n \"type\": \"module\",\n \"bin\": {\n \"jai1\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"redmine.config.example.yaml\",\n \"scripts/redmine-sync-issue.sh\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"license\": \"MIT\",\n \"author\": \"JVIT <dev@jvit.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jvittechs/jai.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/jvittechs/jai/tree/main/packages/cli#readme\",\n \"keywords\": [\n \"jai1\",\n \"framework\",\n \"redmine\",\n \"cli\",\n \"markdown\",\n \"issues\",\n \"context\",\n \"agentic\",\n \"coding\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/cli.ts --dts --format esm --target node22 --out-dir dist --sourcemap\",\n \"dev\": \"tsx src/cli.ts --help\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"release\": \"node scripts/release.js\",\n \"smart-publish\": \"node scripts/smart-publish.js\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.0.2\",\n \"adm-zip\": \"^0.5.16\",\n \"bcryptjs\": \"^2.4.3\",\n \"cli-progress\": \"^3.12.0\",\n \"clipboardy\": \"^4.0.0\",\n \"commander\": \"^12.1.0\",\n \"cronstrue\": \"^2.50.0\",\n \"execa\": \"^9.6.1\",\n \"gray-matter\": \"^4.0.3\",\n \"ink\": \"^5.0.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"marked\": \"^12.0.0\",\n \"marked-terminal\": \"^7.0.0\",\n \"p-limit\": \"^5.0.0\",\n \"p-queue\": \"^7.4.1\",\n \"p-retry\": \"^6.2.0\",\n \"react\": \"^18.3.1\",\n \"slugify\": \"^1.6.6\",\n \"undici\": \"^6.19.5\",\n \"yaml\": \"^2.5.0\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.7\",\n \"@types/node\": \"^24.10.1\",\n \"@types/react\": \"^18.3.12\",\n \"@typescript-eslint/eslint-plugin\": \"^8.6.0\",\n \"@typescript-eslint/parser\": \"^8.6.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.9.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.6.3\",\n \"vitest\": \"^2.1.4\"\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { Jai1Config } from '../types/framework.types.js';\n\n/**\n * Service for managing Jai1 global configuration\n * Config stored in ~/.jai1/config.json\n */\nexport class ConfigService {\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor() {\n this.configDir = join(homedir(), '.jai1');\n this.configPath = join(this.configDir, 'config.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load configuration from file\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1Config | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1Config;\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save configuration to file\n * Creates directory if it doesn't exist\n * Sets proper file permissions (600)\n */\n async save(config: Jai1Config): Promise<void> {\n try {\n // Ensure directory exists with restricted permissions\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });\n\n // Write config with restricted permissions\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\n } catch (error) {\n throw new Error(\n `Failed to save config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n}\n","import { ConfigService } from './config.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n// Cache to avoid checking too frequently\nlet lastCheckTime = 0;\nlet cachedLatestVersion: string | null = null;\nlet shouldCheckUpdates = true;\nconst CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Disable automatic update checks for this session\n */\nexport function disableUpdateCheck() {\n shouldCheckUpdates = false;\n}\n\n/**\n * Check if there's a newer version of jai1-client available\n * This runs silently and only shows a message if update is available\n */\nexport async function checkForClientUpdate(): Promise<void> {\n if (!shouldCheckUpdates) return;\n\n try {\n // Check only once per hour\n const now = Date.now();\n if (now - lastCheckTime < CHECK_INTERVAL_MS && cachedLatestVersion) {\n if (isNewerVersion(cachedLatestVersion, packageJson.version)) {\n showUpdateNotification(cachedLatestVersion);\n }\n return;\n }\n\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n return; // Not initialized, skip check\n }\n\n // Fetch latest client version from API\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return; // Silently fail\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n lastCheckTime = now;\n cachedLatestVersion = data.version;\n\n if (isNewerVersion(data.version, packageJson.version)) {\n showUpdateNotification(data.version);\n }\n } catch {\n // Silently fail - don't interrupt user flow\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Show update notification to user\n */\nfunction showUpdateNotification(latestVersion: string): void {\n console.log('');\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${packageJson.version} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} Run: ${colors.cyan}jai1 upgrade${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}`);\n console.log('');\n}\n\n/**\n * Get current client version\n */\nexport function getClientVersion(): string {\n return packageJson.version;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { trackActionSync } from '../../services/tracking.service.js';\nimport { ValidationError, AuthenticationError } from '../../errors/index.js';\nimport type { InitOptions } from '../../types/framework.types.js';\n\n/**\n * Create auth command for Jai1 Framework\n * Allows both interactive and non-interactive modes\n */\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth')\n .description('Authenticate and configure jai1-client')\n .option('--api-url <url>', 'Jai1 Store API URL')\n .option('--access-key <key>', 'Your access key')\n .action(async (options: InitOptions) => {\n await handleAuth(options);\n });\n\n return cmd;\n}\n\nasync function handleAuth(options: InitOptions): Promise<void> {\n const configService = new ConfigService();\n\n let apiUrl: string;\n let accessKey: string;\n let isInteractive = false;\n\n // Check if config already exists\n const existingConfig = await configService.load();\n if (existingConfig) {\n console.log('⚠️ Configuration already exists at:', configService.getConfigPath());\n console.log(' Run this command again with new values to overwrite.');\n console.log('');\n }\n\n // Interactive vs Non-Interactive mode\n if (options.apiUrl && options.accessKey) {\n // Non-interactive mode\n apiUrl = options.apiUrl;\n accessKey = options.accessKey;\n } else if (options.apiUrl || options.accessKey) {\n // Partial options provided - error\n throw new ValidationError(\n 'Both --api-url and --access-key are required in non-interactive mode'\n );\n } else {\n // Interactive mode\n isInteractive = true;\n console.log('🚀 Jai1 Client Setup');\n console.log('─────────────────\\n');\n\n // For now, use simple readline until inquirer is installed\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n\n apiUrl = await question('API URL (https://store.jai1.io): ');\n if (!apiUrl) {\n apiUrl = 'https://store.jai1.io';\n }\n\n accessKey = await question('Access Key: ');\n if (!accessKey) {\n rl.close();\n throw new ValidationError('Access key is required');\n }\n\n rl.close();\n }\n\n // Validate API URL format\n try {\n new URL(apiUrl);\n } catch {\n throw new ValidationError('Invalid API URL format');\n }\n\n console.log('\\nValidating access key...');\n\n // TODO: Validate access key with API\n // For now, just save it\n // const isValid = await validateAccessKey(apiUrl, accessKey);\n // if (!isValid) {\n // throw new AuthenticationError('Invalid access key');\n // }\n\n // Save config\n await configService.save({\n apiUrl,\n accessKey,\n version: null,\n lastUpdated: null,\n });\n\n // Track auth action (sync to ensure it completes before exit)\n await trackActionSync('auth', {\n configPath: configService.getConfigPath(),\n mode: isInteractive ? 'interactive' : 'non-interactive',\n isReconfig: !!existingConfig,\n });\n\n console.log('✓ Configuration saved to', configService.getConfigPath());\n console.log('');\n console.log(\"You're all set! Run 'jai1 check' to check for updates.\");\n}\n","import { ConfigService } from './config.service.js';\nimport { platform, release, arch, hostname, homedir } from 'os';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tracking action categories\n */\nexport type TrackingAction =\n | 'init'\n | 'download'\n | 'version_check'\n | 'sync'\n | 'update'\n | 'redmine_check'\n | 'redmine_sync_issue'\n | 'redmine_sync_project'\n | 'vscode'\n | 'info'\n | 'check';\n\nexport interface TrackingDetail {\n [key: string]: unknown;\n}\n\n/**\n * Get basic system info for logging\n */\nfunction getSystemInfo(): Record<string, string> {\n return {\n os: platform(),\n osRelease: release(),\n arch: arch(),\n nodeVersion: nodeVersion,\n hostname: hostname(),\n homeDir: homedir(),\n };\n}\n\n/**\n * Service for tracking CLI usage to server\n * Tracking is fire-and-forget, errors are silently ignored\n */\nexport class TrackingService {\n private configService: ConfigService;\n\n constructor() {\n this.configService = new ConfigService();\n }\n\n /**\n * Track a CLI action (fire-and-forget)\n * WARNING: Process may exit before request completes\n * Use trackSync for important events\n *\n * @param action - The action being performed\n * @param detail - Optional additional details\n */\n async track(action: TrackingAction, detail?: TrackingDetail): Promise<void> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n\n // Fire and forget - don't await\n this.sendTrackingEvent(trackUrl, config.accessKey, action, detail).catch(\n () => {\n // Silently ignore tracking errors\n }\n );\n } catch {\n // Silently ignore config errors\n }\n }\n\n /**\n * Track a CLI action synchronously (waits for completion)\n * Use this for important events before process exit\n */\n async trackSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return false;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n return await this.sendTrackingEvent(trackUrl, config.accessKey, action, detail);\n } catch {\n return false;\n }\n }\n\n private async sendTrackingEvent(\n trackUrl: string,\n accessKey: string,\n action: TrackingAction,\n detail?: TrackingDetail\n ): Promise<boolean> {\n try {\n // Merge detail with system info\n const enrichedDetail = {\n ...getSystemInfo(),\n ...detail,\n };\n\n const response = await fetch(trackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n action,\n detail: enrichedDetail,\n clientVersion: packageJson.version,\n }),\n // Timeout to avoid blocking too long\n signal: AbortSignal.timeout(10000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance for convenience\nlet trackingInstance: TrackingService | null = null;\n\n/**\n * Get or create tracking service instance\n */\nexport function getTrackingService(): TrackingService {\n if (!trackingInstance) {\n trackingInstance = new TrackingService();\n }\n return trackingInstance;\n}\n\n/**\n * Convenience function to track an action (fire-and-forget)\n * WARNING: May not complete before process exit\n */\nexport function trackAction(action: TrackingAction, detail?: TrackingDetail): void {\n getTrackingService().track(action, detail);\n}\n\n/**\n * Convenience function to track an action synchronously\n * Use this for important events at end of commands\n */\nexport async function trackActionSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n return getTrackingService().trackSync(action, detail);\n}\n","/**\n * Status Command\n * Show jai1-client configuration and installed components status\n * \n * Renamed from 'info' to 'status' for clarity (common CLI pattern)\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../types/framework.types.js';\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show configuration and installed components status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleStatus(options);\n });\n\n return cmd;\n}\n\nasync function handleStatus(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n const installedComponents = await componentsService.getInstalled();\n const componentCount = Object.keys(installedComponents).length;\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n componentCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('📊 Jai1 Client Status');\n console.log('─────────────────────\\n');\n\n // Configuration section\n console.log('🔧 Configuration');\n console.log(` Config: ${info.configPath}`);\n console.log(` API URL: ${info.apiUrl}`);\n console.log(` Access Key: ${info.accessKey}`);\n console.log();\n\n // Framework section\n console.log('📦 Framework');\n console.log(` Version: ${info.version}`);\n console.log(` Updated: ${info.lastUpdated}`);\n console.log(` Location: ${info.frameworkPath}`);\n console.log();\n\n // Project section\n console.log('📁 Project');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Components: ${componentCount} installed`);\n }\n console.log();\n\n // Quick tips\n if (!info.projectStatus.exists) {\n console.log('💡 Run \"jai1 apply\" to install components for this project.');\n } else if (componentCount > 0) {\n console.log('💡 Run \"jai1 check\" to check for component updates.');\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n\n await fs.mkdir(targetFolder, { recursive: true });\n\n let checksumContent = component.content; // Default for simple types\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n // For bundle it was set above\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { UnifiedApplyApp } from '../ui/apply/UnifiedApplyApp.js';\n\n/**\n * Create apply command with Unified Ink UI\n */\nexport function createApplyCommand(): Command {\n const cmd = new Command('apply')\n .description('Apply components to your project (interactive UI)')\n .argument('[items...]', 'Package name or component filepaths (non-interactive mode)')\n .option('--force', 'Force overwrite even if modified locally')\n .option('--no-interactive', 'Disable interactive UI (for CI/CD)')\n .action(async (items: string[], options: { force?: boolean; interactive?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Non-interactive mode or direct arguments\n if (options.interactive === false || items.length > 0) {\n await nonInteractiveApply(config, items, options);\n return;\n }\n\n // Interactive mode with Unified Ink UI\n const { waitUntilExit } = render(\n React.createElement(UnifiedApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Non-interactive apply (for CLI args or CI/CD)\n */\nasync function nonInteractiveApply(\n config: any,\n items: string[],\n options: { force?: boolean }\n) {\n const componentsService = new ComponentsService();\n\n if (items.length === 0) {\n console.log('❌ No items specified. Use interactive mode or provide package/component names.');\n console.log('💡 Usage: jai1 apply <package> or jai1 apply <filepath...>');\n return;\n }\n\n // Check if first arg is a package\n const tags = await componentsService.listTags(config);\n const packageNames = tags.map(t => t.tag);\n\n let filepaths: string[];\n\n if (items.length === 1 && packageNames.includes(items[0]!)) {\n // Package mode\n console.log(`📦 Applying package '${items[0]}'...`);\n const components = await componentsService.list(config, { tag: items[0] });\n filepaths = components.map(c => c.filepath);\n } else {\n // Direct filepaths\n filepaths = items;\n }\n\n // Resolve dependencies\n console.log('🔍 Resolving dependencies...');\n const resolvedPaths = await componentsService.resolveWithDependencies(config, filepaths);\n\n console.log(`📦 Will apply ${resolvedPaths.length} component(s):`);\n for (const fp of resolvedPaths) {\n const isDep = !filepaths.includes(fp);\n const suffix = isDep ? ' (dependency)' : '';\n console.log(` - ${fp}${suffix}`);\n }\n\n // Install\n const targetDir = process.cwd() + '/.jai1';\n const installed = await componentsService.getInstalled();\n let added = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const fp of resolvedPaths) {\n try {\n const info = installed[fp];\n\n if (info && !options.force && info.modified) {\n console.log(`⚠️ ${fp}: modified locally. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n\n console.log(`📥 Downloading ${fp}...`);\n await componentsService.install(config, fp, targetDir);\n\n if (info) updated++;\n else added++;\n\n console.log(`✅ ${fp}`);\n } catch (error) {\n console.log(`❌ ${fp}: ${error instanceof Error ? error.message : 'Error'}`);\n }\n }\n\n console.log(`\\n✅ Complete: ${added} added, ${updated} updated, ${skipped} skipped`);\n console.log(`📁 Location: ${targetDir}`);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary';\n\ninterface UnifiedApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Unified Apply App - All-in-one interface\n */\nexport const UnifiedApplyApp: React.FC<UnifiedApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n const [focusArea, setFocusArea] = useState<'search' | 'packages' | 'components'>('components');\n const [selectedPackageIndex, setSelectedPackageIndex] = useState(0);\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n const service = new ComponentsService();\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled(),\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data');\n } finally {\n setLoading(false);\n }\n };\n loadData();\n }, []);\n\n // Filter components based on search\n const filteredComponents = useMemo(() => {\n if (!searchQuery.trim()) return components;\n const query = searchQuery.toLowerCase();\n return components.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.name.toLowerCase().includes(query) ||\n (c.tags && c.tags.some(t => t.toLowerCase().includes(query)))\n );\n }, [components, searchQuery]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Summary view - exit on Enter or q\n if (viewState === 'summary') {\n if (key.return || input === 'q' || key.escape) {\n onExit();\n }\n return;\n }\n\n // Installing view - no input\n if (viewState === 'installing') {\n return;\n }\n\n // Browse view\n // Tab to switch focus areas\n if (key.tab) {\n if (focusArea === 'search') setFocusArea('packages');\n else if (focusArea === 'packages') setFocusArea('components');\n else setFocusArea('search');\n return;\n }\n\n // Escape to exit\n if (key.escape || input === 'q') {\n onExit();\n return;\n }\n\n // Enter to apply\n if (key.return && focusArea !== 'search') {\n if (selectedPaths.size > 0) {\n handleApply();\n }\n return;\n }\n\n // Navigation in components\n if (focusArea === 'components') {\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle selection\n const current = filteredComponents[cursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) {\n next.delete(current.filepath);\n } else {\n next.add(current.filepath);\n }\n return next;\n });\n }\n } else if (input === 'a') {\n // Select all filtered\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n } else if (input === 'c') {\n // Clear selection\n setSelectedPaths(new Set());\n }\n }\n\n // Navigation in packages\n if (focusArea === 'packages') {\n if (key.leftArrow) {\n setSelectedPackageIndex(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedPackageIndex(prev => Math.min(tags.length - 1, prev + 1));\n } else if (input === ' ' || key.return) {\n // Quick select package\n const tag = tags[selectedPackageIndex];\n if (tag) {\n const packageComponents = components.filter(c => c.tags?.includes(tag.tag));\n setSelectedPaths(prev => {\n const next = new Set(prev);\n packageComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n // Also filter to this package\n setSearchQuery(tag.tag);\n }\n }\n }\n });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n // Resolve dependencies\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n // Initialize progress\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const,\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n\n // Update to downloading\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: 'Modified locally' } : p\n ));\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: err instanceof Error ? err.message : 'Error' } : p\n ));\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n setViewState('summary');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> Đang tải components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">❌ Error: {error}</Text>\n <Text dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Installing Components</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n 📊 <Text color=\"green\">{installStats.added} added</Text>\n {' · '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' · '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">✅ Installation Complete!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> └─ <Text color=\"green\">{installStats.added}</Text> newly added</Text>\n <Text> └─ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> └─ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n\n <Box marginTop={1}>\n <Text>📁 Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter or q to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse (main view)\n const visibleComponents = filteredComponents.slice(0, 12);\n const hasMore = filteredComponents.length > 12;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Jai1 Apply</Text>\n <Text dimColor> - Select components to install</Text>\n </Box>\n\n {/* Search Box */}\n <Box marginBottom={1}>\n <Text color={focusArea === 'search' ? 'cyan' : 'gray'}>🔍 Search: </Text>\n {focusArea === 'search' ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>Press Tab to search</Text>}</Text>\n )}\n </Box>\n\n {/* Quick Packages */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold dimColor>Quick Apply (Packages):</Text>\n <Box marginTop={1} flexWrap=\"wrap\">\n {tags.slice(0, 6).map((tag, i) => {\n const isSelected = focusArea === 'packages' && i === selectedPackageIndex;\n return (\n <Box key={tag.tag} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n [{tag.tag}:{tag.count}]\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Components List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={focusArea === 'components' ? 'cyan' : 'gray'} padding={1}>\n <Box marginBottom={1}>\n <Text bold>Components </Text>\n <Text dimColor>({filteredComponents.length} shown{hasMore ? `, scroll for more` : ''})</Text>\n </Box>\n\n {visibleComponents.map((comp, i) => {\n const isCursor = i === cursorIndex && focusArea === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? '❯ ' : ' '}\n {isChecked ? '[✓]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? '✓ installed' : '○ new'}</Text>\n </Box>\n );\n })}\n\n {filteredComponents.length === 0 && (\n <Text dimColor>No components match your search</Text>\n )}\n </Box>\n\n {/* Selected Preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Selected: {selectedPaths.size} components</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {Array.from(selectedPaths).slice(0, 4).map(fp => (\n <Text key={fp} dimColor>📌 {fp}</Text>\n ))}\n {selectedPaths.size > 4 && (\n <Text dimColor> ... and {selectedPaths.size - 4} more</Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Switch area · [↑↓] Navigate · [␣] Toggle · [a] Select all · [c] Clear · [Enter] Apply · [q] Quit\n </Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ProgressBarProps {\n current: number;\n total: number;\n width?: number;\n showPercentage?: boolean;\n color?: string;\n}\n\n/**\n * ASCII progress bar component\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n current,\n total,\n width = 40,\n showPercentage = true,\n color = 'cyan',\n}) => {\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return (\n <Box>\n <Text color={color}>{bar}</Text>\n {showPercentage && (\n <Text dimColor> {current}/{total} ({percentage}%)</Text>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Text } from 'ink';\nimport { theme } from './theme.js';\n\nexport type Status = 'success' | 'error' | 'pending' | 'loading' | 'warning';\n\ninterface StatusIconProps {\n status: Status;\n text?: string;\n}\n\n/**\n * Status icon component with optional text\n */\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status, text }) => {\n const iconMap: Record<Status, string> = {\n success: theme.icons.success,\n error: theme.icons.error,\n pending: theme.icons.pending,\n loading: theme.icons.loading,\n warning: theme.icons.warning,\n };\n\n const colorMap: Record<Status, string> = {\n success: 'green',\n error: 'red',\n pending: 'gray',\n loading: 'yellow',\n warning: 'yellow',\n };\n\n const icon = iconMap[status];\n const color = colorMap[status];\n\n return (\n <Text color={color}>\n {icon} {text}\n </Text>\n );\n};\n","/**\n * Theme configuration for Ink UI components\n */\n\nexport const theme = {\n colors: {\n primary: '#6366f1', // Indigo\n success: '#22c55e', // Green\n warning: '#eab308', // Yellow\n error: '#ef4444', // Red\n muted: '#6b7280', // Gray\n border: '#374151', // Dark gray\n text: '#f3f4f6', // Light gray\n background: '#1a1a2e', // Dark background\n },\n\n icons: {\n success: '✅',\n error: '❌',\n pending: '○',\n loading: '⏳',\n package: '📦',\n folder: '📁',\n file: '📄',\n tip: '💡',\n warning: '⚠️',\n checkmark: '✓',\n arrow: '→',\n bullet: '•',\n },\n\n borders: {\n single: {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n },\n double: {\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n horizontal: '═',\n vertical: '║',\n },\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n return new Command('update')\n .description('Update installed components to latest versions')\n .option('--force', 'Force update even if files are modified locally')\n .action(async (options: { force?: boolean }) => {\n await handleUpdate(options);\n });\n}\n\nasync function handleUpdate(options: { force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to add components.');\n return;\n }\n\n console.log('🔍 Checking for updates...');\n\n // Get checksums from API\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n console.log(`⚠️ ${fp}: Component not found on server (deprecated?)`);\n continue;\n }\n\n // Check if update needed based on checksum or version\n // Using checksum is more reliable for content changes\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n if (updates.length === 0) {\n console.log('✅ All components are up to date.');\n return;\n }\n\n console.log(`\\n📦 Found ${updates.length} updates:`);\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` - ${fp} (v${current.version} → v${latest.version})`);\n }\n console.log();\n\n if (!options.force) {\n const shouldUpdate = await confirm({ message: 'Update now?', default: true });\n if (!shouldUpdate) return;\n }\n\n // Perform updates\n const targetDir = process.cwd() + '/.jai1';\n let updatedCount = 0;\n const backupPaths: string[] = [];\n\n for (const fp of updates) {\n try {\n // Backup\n console.log(`📥 Updating ${fp}...`);\n const backupPath = await componentsService.backupFile(fp, targetDir);\n if (backupPath) {\n backupPaths.push(backupPath);\n // Simplify backup path for display\n const displayPath = backupPath.split('.jai1_backup/')[1];\n console.log(` Backed up: .../${displayPath}`);\n }\n\n // Install\n await componentsService.install(config, fp, targetDir);\n console.log(`✅ Updated`);\n updatedCount++;\n } catch (error) {\n console.log(`❌ Failed to update ${fp}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n console.log(`\\n✅ Update complete: ${updatedCount}/${updates.length} updated.`);\n\n if (backupPaths.length > 0) {\n console.log(`\\n📁 Backups created in .jai1_backup/`);\n\n // Default No for cleanup safety\n const cleanBackups = await confirm({ message: 'Clear these backups?', default: false });\n if (cleanBackups) {\n await componentsService.clearBackups(process.cwd());\n console.log('🗑️ Backups cleared.');\n } else {\n console.log('💡 Run \"jai1 clean\" to remove them later.');\n }\n }\n\n trackAction('components_update', { count: updatedCount });\n\n } catch (error) {\n throw new Error(`Update check failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { trackAction } from '../../services/tracking.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { compareVersions, formatVersion } from '../../utils/version.js';\n\ninterface CheckOptions {\n json?: boolean;\n}\n\n/**\n * Create check command for Jai1 Framework\n * Checks current version and compares with latest from server\n */\nexport function createCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check for framework updates')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleCheck(options: CheckOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to get started.');\n return;\n }\n\n console.log('Checking for updates...\\n');\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n // Component removed from server?\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Output status\n console.log(`📌 Components status:`);\n\n // Show updates first\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` ${fp} v${current.version} → v${latest.version} ⚠️ UPDATE`);\n }\n\n // Show up-to-date (limit showing all if too many?)\n // Let's show all for now, or just summary\n if (updates.length === 0 && upToDate.length > 0) {\n console.log(` ✓ All ${upToDate.length} components up to date.`);\n } else if (upToDate.length > 0) {\n console.log(` ✓ ${upToDate.length} components up to date.`);\n }\n\n console.log();\n if (updates.length > 0) {\n console.log(`Status: ${updates.length} component(s) update available!`);\n console.log(`Run 'jai1 update' to update.`);\n } else {\n console.log(`Status: ✅ All good!`);\n }\n\n } catch (error) {\n console.error('Error checking updates:', error instanceof Error ? error.message : error);\n }\n}\n\n","/**\n * IDE Command Group\n * Manages IDE integration commands: context, setup, sync\n */\nimport { Command } from 'commander';\nimport { createContextSubcommand } from './context.js';\nimport { createSetupSubcommand } from './setup.js';\nimport { createSyncSubcommand } from './sync.js';\n\n/**\n * Create IDE command group\n * Subcommands:\n * - context: Browse and explore IDE context\n * - setup: Configure IDE settings (VSCode optimizations)\n * - sync: Sync .jai1 content to IDE directories\n */\nexport function createIdeCommand(): Command {\n const ideCommand = new Command('ide')\n .description('IDE integration and configuration commands');\n\n // Add subcommands\n ideCommand.addCommand(createContextSubcommand());\n ideCommand.addCommand(createSetupSubcommand());\n ideCommand.addCommand(createSyncSubcommand());\n\n // Default action - show help\n ideCommand.action(() => {\n ideCommand.help();\n });\n\n return ideCommand;\n}\n","/**\n * IDE Context Subcommand\n * Browse and explore IDE context (rules, workflows, skills, etc.)\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../../types/context.types.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\n/**\n * Create context subcommand for IDE group\n */\nexport function createContextSubcommand(): Command {\n const cmd = new Command('context')\n .description('Browse and explore IDE context (rules, workflows, skills)')\n .option('--target <ide>', 'Open specific IDE context (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Show specific content type (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Show context statistics (non-interactive)')\n .action(async (options: { target?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.target) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.target)) {\n console.error(`❌ Invalid IDE: ${options.target}`);\n console.error(` Valid IDEs: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.target as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Invalid content type: ${options.type}`);\n console.error(` Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Scanning context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ No context found');\n console.log(' Run `jai1 apply` to install context for your IDE.\\n');\n return;\n }\n\n console.log('📊 Context Statistics\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('en-US')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Total: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Error scanning context:', error);\n process.exit(1);\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { IDE, ContentType, IDEContext, ContextItem } from '../../types/context.types.js';\nimport { MainMenuView } from './views/MainMenuView.js';\nimport { IDEOverviewView } from './views/IDEOverviewView.js';\nimport { ListView } from './views/ListView.js';\nimport { DetailView } from './views/DetailView.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\nexport type ContextScreen = 'menu' | 'overview' | 'list' | 'detail';\n\ninterface ContextAppProps {\n initialIDE?: IDE;\n initialType?: ContentType;\n onExit: () => void;\n}\n\n/**\n * ContextApp - Interactive Context Visualizer\n */\nexport const ContextApp: React.FC<ContextAppProps> = ({ initialIDE, initialType, onExit }) => {\n const { exit } = useApp();\n const [screen, setScreen] = useState<ContextScreen>('menu');\n const [selectedIDE, setSelectedIDE] = useState<IDE | null>(initialIDE || null);\n const [selectedType, setSelectedType] = useState<ContentType | null>(initialType || null);\n const [selectedItem, setSelectedItem] = useState<ContextItem | null>(null);\n\n const [ideContexts, setIdeContexts] = useState<IDEContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Scan context on mount\n useEffect(() => {\n const scanner = new ContextScannerService();\n scanner.scanAll().then(result => {\n setIdeContexts(result.ides);\n setLoading(false);\n\n // If initialIDE is set, jump to overview\n if (initialIDE) {\n setScreen('overview');\n }\n }).catch(error => {\n console.error('Failed to scan context:', error);\n setLoading(false);\n });\n }, [initialIDE]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // q to quit (global)\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Escape or Backspace to go back (NOT in detail view - DetailView handles its own input)\n if (screen !== 'detail' && (key.escape || key.backspace)) {\n handleBack();\n return;\n }\n });\n\n const handleBack = () => {\n if (screen === 'detail') {\n setScreen('list');\n setSelectedItem(null);\n setScrollPosition(0);\n } else if (screen === 'list') {\n setScreen('overview');\n setSelectedType(null);\n } else if (screen === 'overview') {\n setScreen('menu');\n setSelectedIDE(null);\n } else {\n onExit();\n }\n };\n\n const handleSelectIDE = (ide: IDE) => {\n setSelectedIDE(ide);\n setScreen('overview');\n };\n\n const handleSelectType = (type: ContentType) => {\n setSelectedType(type);\n setScreen('list');\n };\n\n const handleSelectItem = (item: ContextItem) => {\n setSelectedItem(item);\n setScreen('detail');\n setScrollPosition(0);\n };\n\n // Get current IDE context\n const currentIDEContext = ideContexts.find(ctx => ctx.ide === selectedIDE);\n\n // Get current items for selected type\n const currentItems = currentIDEContext?.items?.filter(item => item.type === selectedType) ?? [];\n\n // Render appropriate view\n const renderContent = () => {\n if (loading) {\n return (\n <Box padding={1}>\n <Text>Đang quét context...</Text>\n </Box>\n );\n }\n\n switch (screen) {\n case 'menu':\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n case 'overview':\n return currentIDEContext ? (\n <IDEOverviewView\n ideContext={currentIDEContext}\n onSelectType={handleSelectType}\n onBack={handleBack}\n />\n ) : null;\n case 'list':\n return (\n <ListView\n items={currentItems}\n contentType={selectedType!}\n onSelect={handleSelectItem}\n onBack={handleBack}\n />\n );\n case 'detail':\n return selectedItem ? (\n <DetailView\n item={selectedItem}\n scrollPosition={scrollPosition}\n onBack={handleBack}\n />\n ) : null;\n default:\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n }\n };\n\n // Get footer hints based on screen\n const getFooterHints = () => {\n switch (screen) {\n case 'menu':\n return '[↑↓] Chọn · [Enter] Mở · [q] Thoát';\n case 'overview':\n return '[Tab/1-6] Chuyển tab · [Enter] Xem danh sách · [Esc/←] Quay lại · [q] Thoát';\n case 'list':\n return '[↑↓] Chọn · [Enter] Chi tiết · [Esc/←] Quay lại · [q] Thoát';\n case 'detail':\n return '[↑↓/j/k] Cuộn · [PgUp/u PgDn/d] Cuộn nhanh · [g/G] Đầu/Cuối · [Esc/←] Quay lại · [q] Thoát';\n default:\n return '[q] Thoát';\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📋 Jai1 Context</Text>\n <Text dimColor> - Khám phá context dự án</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{getFooterHints()}</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDE, IDEContext } from '../../../types/context.types.js';\n\ninterface MainMenuViewProps {\n ideContexts: IDEContext[];\n onSelect: (ide: IDE) => void;\n}\n\ninterface IDEMenuItem {\n ide: IDE;\n icon: string;\n title: string;\n itemCount: number;\n available: boolean;\n}\n\n/**\n * MainMenuView - IDE selector menu\n */\nexport const MainMenuView: React.FC<MainMenuViewProps> = ({ ideContexts, onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build menu items\n const menuItems: IDEMenuItem[] = [\n {\n ide: 'cursor',\n icon: '🔮',\n title: 'Cursor',\n itemCount: ideContexts.find(ctx => ctx.ide === 'cursor')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'cursor'),\n },\n {\n ide: 'windsurf',\n icon: '🏄',\n title: 'Windsurf',\n itemCount: ideContexts.find(ctx => ctx.ide === 'windsurf')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'windsurf'),\n },\n {\n ide: 'antigravity',\n icon: '🚀',\n title: 'Antigravity (Claude)',\n itemCount: ideContexts.find(ctx => ctx.ide === 'antigravity')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'antigravity'),\n },\n {\n ide: 'jai1',\n icon: '🤖',\n title: 'Jai1 Framework',\n itemCount: ideContexts.find(ctx => ctx.ide === 'jai1')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'jai1'),\n },\n ];\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item && item.available) {\n onSelect(item.ide);\n }\n }\n }, { isActive: true });\n\n // Format item count summary\n const formatSummary = (item: IDEMenuItem): string => {\n if (!item.available) {\n return 'Không có context';\n }\n\n const ctx = ideContexts.find(c => c.ide === item.ide);\n if (!ctx) return '';\n\n const parts: string[] = [];\n if (ctx.stats.byType.rules) parts.push(`${ctx.stats.byType.rules} rules`);\n if (ctx.stats.byType.workflows) parts.push(`${ctx.stats.byType.workflows} workflows`);\n if (ctx.stats.byType.skills) parts.push(`${ctx.stats.byType.skills} skills`);\n if (ctx.stats.byType.agents) parts.push(`${ctx.stats.byType.agents} agents`);\n if (ctx.stats.byType.prompts) parts.push(`${ctx.stats.byType.prompts} prompts`);\n\n return parts.join(', ') || `${item.itemCount} items`;\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"cyan\">Jai1 Context</Text>!</Text>\n <Text dimColor>\n Khám phá và quản lý context cho các IDE hỗ trợ Agentic Coding.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn IDE để khám phá:</Text>\n\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex;\n const dimmed = !item.available;\n\n return (\n <Box key={item.ide} marginY={0}>\n <Text color={isSelected ? 'cyan' : dimmed ? 'gray' : 'white'} dimColor={dimmed}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.available && (\n <Text dimColor> - {formatSummary(item)}</Text>\n )}\n {!item.available && (\n <Text dimColor> - Không có context</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n {ideContexts.length === 0 && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\n <Text color=\"yellow\">⚠️ Không tìm thấy context nào</Text>\n <Text dimColor>Hãy chạy </Text>\n <Text color=\"cyan\">jai1 apply</Text>\n <Text dimColor> để cài đặt context cho IDE của bạn.</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDEContext, ContentType } from '../../../types/context.types.js';\n\ninterface IDEOverviewViewProps {\n ideContext: IDEContext;\n onSelectType: (type: ContentType) => void;\n onBack: () => void;\n}\n\ninterface ContentTypeTab {\n type: ContentType;\n label: string;\n icon: string;\n count: number;\n}\n\n/**\n * IDEOverviewView - Overview of an IDE's context with tabs\n */\nexport const IDEOverviewView: React.FC<IDEOverviewViewProps> = ({\n ideContext,\n onSelectType,\n onBack,\n}) => {\n const [selectedTabIndex, setSelectedTabIndex] = useState(0);\n\n // Build tabs from available content types\n const tabs: ContentTypeTab[] = [];\n\n if (ideContext.stats.byType.rules) {\n tabs.push({\n type: 'rules',\n label: 'Rules',\n icon: '📜',\n count: ideContext.stats.byType.rules,\n });\n }\n if (ideContext.stats.byType.workflows) {\n tabs.push({\n type: 'workflows',\n label: 'Workflows',\n icon: '🔄',\n count: ideContext.stats.byType.workflows,\n });\n }\n if (ideContext.stats.byType.skills) {\n tabs.push({\n type: 'skills',\n label: 'Skills',\n icon: '🛠',\n count: ideContext.stats.byType.skills,\n });\n }\n if (ideContext.stats.byType.agents) {\n tabs.push({\n type: 'agents',\n label: 'Agents',\n icon: '🤖',\n count: ideContext.stats.byType.agents,\n });\n }\n if (ideContext.stats.byType.prompts) {\n tabs.push({\n type: 'prompts',\n label: 'Prompts',\n icon: '💬',\n count: ideContext.stats.byType.prompts,\n });\n }\n if (ideContext.stats.byType.context) {\n tabs.push({\n type: 'context',\n label: 'Context',\n icon: '📋',\n count: ideContext.stats.byType.context,\n });\n }\n\n useInput((input, key) => {\n // Tab navigation\n if (key.tab || key.rightArrow) {\n setSelectedTabIndex(prev => Math.min(tabs.length - 1, prev + 1));\n } else if (key.leftArrow) {\n setSelectedTabIndex(prev => Math.max(0, prev - 1));\n }\n\n // Number shortcuts (1-6)\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= tabs.length) {\n setSelectedTabIndex(num - 1);\n }\n\n // Enter to select\n if (key.return) {\n const tab = tabs[selectedTabIndex];\n if (tab) {\n onSelectType(tab.type);\n }\n }\n }, { isActive: true });\n\n // Get current tab\n const currentTab = tabs[selectedTabIndex];\n\n // Get items for current tab\n const currentItems = currentTab\n ? ideContext?.items?.filter(item => item.type === currentTab.type) ?? []\n : [];\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{ideContext.config.icon} {ideContext.config.name}</Text>\n </Box>\n\n {/* Summary Stats */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>📊 Tổng quan</Text>\n <Box marginTop={1}>\n <Text>\n 📁 Tổng: <Text bold color=\"cyan\">{ideContext.stats.totalItems} items</Text>\n </Text>\n <Text dimColor> · </Text>\n <Text>\n 💾 Kích thước: <Text bold>{formatSize(ideContext.stats.totalSize)}</Text>\n </Text>\n {ideContext.stats.lastModified && (\n <>\n <Text dimColor> · </Text>\n <Text>\n 🕐 Cập nhật: <Text bold>{formatDate(ideContext.stats.lastModified)}</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Content Type Tabs */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {/* Tab Headers */}\n <Box marginBottom={1}>\n {tabs.map((tab, index) => {\n const isSelected = index === selectedTabIndex;\n return (\n <Box key={tab.type} marginRight={1}>\n <Text\n color={isSelected ? 'cyan' : 'gray'}\n bold={isSelected}\n inverse={isSelected}\n >\n {' '}{tab.icon} {tab.label} ({tab.count}){' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Tab Content Preview */}\n {currentTab && currentItems.length > 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Preview (nhấn Enter để xem chi tiết):</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {currentItems.slice(0, 5).map(item => (\n <Box key={item.id} marginY={0}>\n <Text>• {item.name}</Text>\n {item.description && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n ))}\n {currentItems.length > 5 && (\n <Text dimColor>... và {currentItems.length - 5} items khác</Text>\n )}\n </Box>\n </Box>\n )}\n\n {currentTab && currentItems.length === 0 && (\n <Text dimColor>Không có items nào trong {currentTab.label}</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem, ContentType } from '../../../types/context.types.js';\n\ninterface ListViewProps {\n items: ContextItem[];\n contentType: ContentType;\n onSelect: (item: ContextItem) => void;\n onBack: () => void;\n}\n\n/**\n * ListView - List view for context items\n */\nexport const ListView: React.FC<ListViewProps> = ({ items, contentType, onSelect, onBack }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n onSelect(item);\n }\n }\n }, { isActive: true });\n\n // Get type label\n const getTypeLabel = (): string => {\n switch (contentType) {\n case 'rules':\n return '📜 Rules';\n case 'workflows':\n return '🔄 Workflows';\n case 'skills':\n return '🛠 Skills';\n case 'agents':\n return '🤖 Agents';\n case 'prompts':\n return '💬 Prompts';\n case 'context':\n return '📋 Context';\n default:\n return contentType;\n }\n };\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n if (items.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text dimColor>Không có items nào</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n <Text dimColor> - {items.length} items</Text>\n </Box>\n\n {/* Items List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginY={0}>\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.name}\n </Text>\n <Text dimColor> ({formatSize(item.fileSize)})</Text>\n </Box>\n\n {isSelected && (\n <Box marginLeft={3} flexDirection=\"column\">\n {item.description && (\n <Text dimColor>📝 {item.description}</Text>\n )}\n\n {/* Rules-specific metadata */}\n {contentType === 'rules' && (\n <>\n {item.alwaysApply && (\n <Text dimColor>✅ Always active</Text>\n )}\n {item.globs && item.globs.length > 0 && (\n <Text dimColor>🎯 Globs: {item.globs.join(', ')}</Text>\n )}\n </>\n )}\n\n {/* Skills-specific metadata */}\n {contentType === 'skills' && (\n <Box>\n {item.hasScripts && <Text dimColor>📦 scripts/ </Text>}\n {item.hasReferences && <Text dimColor>📚 references/ </Text>}\n {item.hasAssets && <Text dimColor>🎨 assets/ </Text>}\n </Box>\n )}\n\n {/* Agents-specific metadata */}\n {contentType === 'agents' && item.model && (\n <Text dimColor>🔧 Model: {item.model}</Text>\n )}\n\n <Text dimColor>📁 {item.relativePath}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem } from '../../../types/context.types.js';\n\ninterface DetailViewProps {\n item: ContextItem;\n scrollPosition: number;\n onBack: () => void;\n}\n\n/**\n * DetailView - Detail view for a context item with metadata and preview\n */\nexport const DetailView: React.FC<DetailViewProps> = ({ item, scrollPosition: initialScroll, onBack }) => {\n // Local scroll state\n const [scrollPosition, setScrollPosition] = useState(initialScroll);\n const maxVisibleLines = 25;\n const maxScroll = Math.max(0, item.previewLines.length - maxVisibleLines);\n\n // Handle keyboard input for scrolling\n useInput((input, key) => {\n // Scroll controls\n if (key.upArrow || input === 'k') {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageDown || input === 'd') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 5));\n } else if (key.pageUp || input === 'u') {\n setScrollPosition(prev => Math.max(0, prev - 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n // Back navigation\n else if (key.escape || key.backspace) {\n onBack();\n }\n }, { isActive: true });\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Get visible preview lines based on scroll\n const visibleLines = item.previewLines.slice(\n scrollPosition,\n scrollPosition + maxVisibleLines\n );\n\n const hasMoreAbove = scrollPosition > 0;\n const hasMoreBelow = scrollPosition + maxVisibleLines < item.previewLines.length;\n\n // Calculate scroll percentage\n const scrollPercentage = item.previewLines.length <= maxVisibleLines\n ? 100\n : Math.round((scrollPosition / maxScroll) * 100);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header with compact metadata */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">{item.name}</Text>\n <Box>\n <Text dimColor>{item.relativePath} • {formatSize(item.fileSize)}</Text>\n {item.description && <Text dimColor> • {item.description}</Text>}\n </Box>\n <Box>\n {/* Type-specific metadata in one line */}\n {item.type === 'rules' && item.globs && item.globs.length > 0 && (\n <Text dimColor>globs: {item.globs.join(', ')}</Text>\n )}\n {item.type === 'agents' && item.model && (\n <Text dimColor>model: {item.model}</Text>\n )}\n {item.type === 'skills' && (\n <Text dimColor>\n {item.hasScripts && '📦 scripts '}\n {item.hasReferences && '📚 refs '}\n {item.hasAssets && '🎨 assets'}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Preview Panel */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold>👁️ Preview</Text>\n {item.previewLines.length > maxVisibleLines && (\n <Text dimColor>\n [{scrollPosition + 1}-{Math.min(scrollPosition + maxVisibleLines, item.previewLines.length)}/{item.lineCount}] {scrollPercentage}%\n </Text>\n )}\n </Box>\n\n {hasMoreAbove && (\n <Box justifyContent=\"center\">\n <Text dimColor>▲ ▲ ▲ ({scrollPosition} dòng ở trên) ▲ ▲ ▲</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line, index) => {\n const lineNumber = scrollPosition + index + 1;\n return (\n <Box key={index}>\n <Text dimColor>{lineNumber.toString().padStart(3, ' ')}│ </Text>\n <Text>{line}</Text>\n </Box>\n );\n })}\n </Box>\n\n {hasMoreBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n ▼ ▼ ▼ ({item.lineCount - scrollPosition - visibleLines.length} dòng ở dưới) ▼ ▼ ▼\n </Text>\n </Box>\n )}\n\n {item.previewLines.length === 0 && (\n <Text dimColor>Không có nội dung để hiển thị</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport type {\n IDE,\n ContentType,\n ContextItem,\n IDEContext,\n ProjectContext,\n ContextStats,\n} from '../types/context.types.js';\nimport { IDE_CONFIGS, getAllIDEs } from '../constants/ide-configs.js';\n\n/**\n * Service for scanning and parsing context files\n */\nexport class ContextScannerService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Scan all IDEs for context\n */\n async scanAll(): Promise<ProjectContext> {\n const ides = await this.detectIDEs();\n const ideContexts: IDEContext[] = [];\n\n for (const ide of ides) {\n try {\n const context = await this.scanIDE(ide);\n if (context.items.length > 0) {\n ideContexts.push(context);\n }\n } catch (error) {\n // Skip IDEs that fail to scan\n console.error(`Failed to scan ${ide}:`, error);\n }\n }\n\n const totalItems = ideContexts.reduce((sum, ctx) => sum + ctx.items.length, 0);\n\n return {\n projectPath: this.projectPath,\n ides: ideContexts,\n totalItems,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific IDE\n */\n async scanIDE(ide: IDE): Promise<IDEContext> {\n const config = IDE_CONFIGS[ide];\n const items: ContextItem[] = [];\n\n // Scan each content type\n for (const [type, relativePath] of Object.entries(config.contentPaths)) {\n if (!relativePath) continue;\n\n const contentType = type as ContentType;\n try {\n const typeItems = await this.scanType(ide, contentType);\n items.push(...typeItems);\n } catch (error) {\n // Skip types that fail to scan (directory doesn't exist, etc.)\n }\n }\n\n const stats = this.calculateStats(items);\n\n return {\n ide,\n config,\n items,\n stats,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific content type\n */\n async scanType(ide: IDE, type: ContentType): Promise<ContextItem[]> {\n const config = IDE_CONFIGS[ide];\n const relativePath = config.contentPaths[type];\n if (!relativePath) return [];\n\n let dirPath: string;\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1', relativePath);\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework', relativePath);\n\n // Use whichever path exists\n if (await this.pathExists(jai1Path)) {\n dirPath = jai1Path;\n } else if (await this.pathExists(frameworkPath)) {\n dirPath = frameworkPath;\n } else {\n return [];\n }\n } else {\n dirPath = path.join(this.projectPath, config.basePath, relativePath);\n\n // Check if directory exists\n try {\n await fs.access(dirPath);\n } catch {\n return [];\n }\n }\n\n const extensions = config.fileExtensions[type] || [];\n const items: ContextItem[] = [];\n\n // Special handling for skills (folders with SKILL.md)\n if (type === 'skills') {\n const skillItems = await this.scanSkills(dirPath, ide);\n items.push(...skillItems);\n } else {\n // Regular files\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n\n if (!stat.isFile()) continue;\n\n // Check if file matches extensions\n const matchesExtension = extensions.some(ext => file.endsWith(ext));\n if (!matchesExtension) continue;\n\n try {\n const item = await this.parseContextItem(filepath, ide, type);\n items.push(item);\n } catch (error) {\n console.error(`Failed to parse ${filepath}:`, error);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Scan skills (folders with SKILL.md)\n */\n private async scanSkills(skillsDir: string, ide: IDE): Promise<ContextItem[]> {\n const items: ContextItem[] = [];\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = path.join(skillsDir, entry.name);\n const skillFilePath = path.join(skillPath, 'SKILL.md');\n\n // Check if SKILL.md exists\n try {\n await fs.access(skillFilePath);\n } catch {\n continue;\n }\n\n // Parse SKILL.md\n const item = await this.parseContextItem(skillFilePath, ide, 'skills');\n\n // Check for additional folders\n item.hasScripts = await this.pathExists(path.join(skillPath, 'scripts'));\n item.hasReferences = await this.pathExists(path.join(skillPath, 'references'));\n item.hasAssets = await this.pathExists(path.join(skillPath, 'assets'));\n\n items.push(item);\n }\n } catch (error) {\n console.error(`Failed to scan skills:`, error);\n }\n\n return items;\n }\n\n /**\n * Parse a context item from file\n */\n private async parseContextItem(\n filepath: string,\n ide: IDE,\n type: ContentType\n ): Promise<ContextItem> {\n const content = await fs.readFile(filepath, 'utf-8');\n const stat = await fs.stat(filepath);\n\n // Parse frontmatter\n const { data: frontmatter, content: bodyContent } = matter(content);\n\n // Extract description\n const config = IDE_CONFIGS[ide];\n const description = frontmatter[config.frontmatterSchema.descriptionField] as string | undefined;\n\n // Extract globs/trigger info\n let globs: string[] | undefined;\n let alwaysApply: boolean | undefined;\n\n if (config.frontmatterSchema.alwaysApplyField) {\n const alwaysField = frontmatter[config.frontmatterSchema.alwaysApplyField];\n alwaysApply = alwaysField === true || alwaysField === 'always' || alwaysField === 'always_on';\n }\n\n const triggerValue = frontmatter[config.frontmatterSchema.triggerField];\n if (typeof triggerValue === 'string') {\n globs = [triggerValue];\n } else if (Array.isArray(triggerValue)) {\n globs = triggerValue;\n }\n\n // Extract preview lines\n const { previewLines, lineCount } = this.extractPreview(bodyContent, 20);\n\n // Generate ID\n const relativePath = path.relative(this.projectPath, filepath);\n const id = `${ide}-${type}-${path.basename(filepath, path.extname(filepath))}`;\n\n // Extract name\n const name = frontmatter.name || path.basename(filepath, path.extname(filepath));\n\n return {\n id,\n ide,\n type,\n name,\n filepath,\n relativePath,\n frontmatter,\n description,\n globs,\n alwaysApply,\n model: frontmatter.model as string | undefined,\n fileSize: stat.size,\n modifiedAt: stat.mtime,\n previewLines,\n lineCount,\n };\n }\n\n /**\n * Extract preview lines (after frontmatter)\n */\n private extractPreview(content: string, maxLines: number = 20): { previewLines: string[]; lineCount: number } {\n const lines = content.split('\\n');\n const previewLines = lines.slice(0, maxLines);\n const lineCount = lines.length;\n\n return { previewLines, lineCount };\n }\n\n /**\n * Detect available IDEs in project\n */\n async detectIDEs(): Promise<IDE[]> {\n const ides: IDE[] = [];\n\n for (const ide of getAllIDEs()) {\n const config = IDE_CONFIGS[ide];\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1');\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework');\n\n if (await this.pathExists(jai1Path) || await this.pathExists(frameworkPath)) {\n ides.push(ide);\n }\n } else {\n const idePath = path.join(this.projectPath, config.basePath);\n if (await this.pathExists(idePath)) {\n ides.push(ide);\n }\n }\n }\n\n return ides;\n }\n\n /**\n * Check if path exists\n */\n private async pathExists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate statistics from items\n */\n private calculateStats(items: ContextItem[]): ContextStats {\n const byType: Partial<Record<ContentType, number>> = {};\n\n for (const item of items) {\n byType[item.type] = (byType[item.type] || 0) + 1;\n }\n\n const totalSize = items.reduce((sum, item) => sum + item.fileSize, 0);\n\n const lastModified = items.length > 0\n ? items.reduce((latest, item) =>\n item.modifiedAt > latest ? item.modifiedAt : latest,\n items[0]!.modifiedAt\n )\n : null;\n\n return {\n totalItems: items.length,\n byType,\n totalSize,\n lastModified,\n };\n }\n}\n","import type { IDE, IDEConfig } from '../types/context.types.js';\n\n/**\n * IDE configurations for context scanning\n */\nexport const IDE_CONFIGS: Record<IDE, IDEConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n contentPaths: {\n rules: 'rules',\n workflows: 'commands', // Cursor uses \"commands\" for workflows\n },\n fileExtensions: {\n rules: ['.mdc'], // Cursor-specific markdown\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always'\n descriptionField: 'description',\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity (Claude)',\n icon: '🚀',\n basePath: '.agent',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always_on'\n descriptionField: 'description',\n },\n },\n jai1: {\n id: 'jai1',\n name: 'Jai1 Framework',\n icon: '🤖',\n basePath: '.jai1', // Or packages/jai1-framework\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n skills: 'skills', // Folders with SKILL.md\n agents: 'agents',\n prompts: 'prompts',\n context: 'context',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n skills: ['SKILL.md'], // Special handling for skill folders\n agents: ['.md'],\n prompts: ['.md'],\n context: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n};\n\n/**\n * Get IDE config by ID\n */\nexport function getIDEConfig(ide: IDE): IDEConfig {\n return IDE_CONFIGS[ide];\n}\n\n/**\n * Get all IDE IDs\n */\nexport function getAllIDEs(): IDE[] {\n return Object.keys(IDE_CONFIGS) as IDE[];\n}\n","/**\n * IDE Setup Subcommand\n * Configure IDE settings (VSCode optimizations, etc.)\n * \n * This is a wrapper that re-exports the existing vscode command\n * but as a subcommand under 'ide setup'\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Disable all telemetry and data collection',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Disable/reduce language server load (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Disable built-in Git for better performance',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Exclude directories from file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Exclude directories from search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Disable auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Optimize rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Hide unnecessary UI elements',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\n/**\n * Create setup subcommand for IDE group\n * Manages IDE settings (VSCode optimizations)\n */\nexport function createSetupSubcommand(): Command {\n const setupCommand = new Command('setup')\n .description('Configure IDE settings and optimizations');\n\n // Interactive mode (default)\n setupCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n setupCommand\n .command('enable')\n .description('Enable specific optimization groups')\n .argument('[groups...]', 'Group names to enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n setupCommand\n .command('disable')\n .description('Disable specific optimization groups (restore to default)')\n .argument('[groups...]', 'Group names to disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n setupCommand\n .command('max-performance')\n .description('Enable all optimizations for maximum performance')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n setupCommand\n .command('reset')\n .description('Reset to default settings (remove all optimizations)')\n .argument('[groups...]', 'Group names to reset (empty = reset all)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n setupCommand\n .command('list')\n .description('List all available optimization groups')\n .action(() => {\n console.log('🔧 Available optimization groups:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return setupCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 IDE Settings Manager\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Usage: │');\n console.log('│ • Use ↑↓ keys to navigate │');\n console.log('│ • Press SPACE to select/deselect group │');\n console.log('│ • Press ENTER to confirm and apply │');\n console.log('│ • Press Ctrl+C to cancel │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'What do you want to do?',\n choices: [\n { name: '✅ Enable optimization groups', value: 'enable' },\n { name: '❌ Disable optimization groups', value: 'disable' },\n { name: '🚀 Max Performance (enable all)', value: 'max' },\n { name: '🔄 Reset to defaults', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Select groups to ${action} (SPACE to select, ENTER to confirm):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ No groups selected!');\n console.log(' 💡 Tip: Press SPACE to select at least 1 group before pressing ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Operation cancelled.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Invalid groups: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Run \"jai1 ide setup list\" to see available groups.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Created .vscode/ directory');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Read current settings from settings.json');\n } catch {\n console.warn('⚠️ Cannot read settings.json (may contain comments).');\n const confirmOverwrite = await confirm({\n message: 'Overwrite current settings.json file?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Operation cancelled.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 ${action === 'enable' ? 'Enabling' : 'Disabling'} groups:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Updated IDE settings at: ${settingsPath}`);\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ No settings.json file found');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset ALL settings to default (delete entire file)?'\n : `Reset groups: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Operation cancelled.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Deleted settings.json file');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n","/**\n * IDE Sync Subcommand\n * Sync .jai1 content to IDE directories (rules, workflows, commands)\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\n\n/**\n * Create sync subcommand for IDE group\n * Syncs .jai1 content to IDE-specific directories\n */\nexport function createSyncSubcommand(): Command {\n const cmd = new Command('sync')\n .description('Sync .jai1 content to IDE directories (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runSync(options);\n });\n\n return cmd;\n}\n\nasync function runSync(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Sync rules and workflows to IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ No content found in .jai1/');\n console.log(' 💡 Create files in .jai1/rules/ or .jai1/workflows/ first.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Select target IDE(s) (SPACE to select, ENTER to confirm):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ No IDE selected!');\n console.log(' 💡 Select at least 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Select content types to sync:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ No content type selected!');\n console.log(' 💡 Select at least 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with sync?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Sync cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Syncing...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Sync complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","/**\n * Migration service for IDE content migration\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport type {\n MigrateIDE,\n MigrateContentType,\n SourceContentItem,\n MigrationResult,\n ScanSummary,\n IDEMigrationConfig,\n} from '../types/migrate-ide.types.js';\nimport { IDE_MIGRATION_CONFIGS } from '../constants/ide-migration-configs.js';\n\nexport class MigrateIdeService {\n private projectPath: string;\n private jai1Path: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.jai1Path = path.join(projectPath, '.jai1');\n }\n\n /**\n * Scan .jai1/ directory for content\n */\n async scanJai1Content(): Promise<ScanSummary> {\n const rules = await this.scanContentType('rules');\n const workflows = await this.scanContentType('workflows');\n const commands: SourceContentItem[] = [];\n\n return {\n rules,\n workflows,\n commands,\n totalCount: rules.length + workflows.length + commands.length,\n };\n }\n\n /**\n * Scan a specific content type\n */\n private async scanContentType(type: MigrateContentType): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const dirPath = path.join(this.jai1Path, type);\n\n try {\n await fs.access(dirPath);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n const { data: frontmatter } = matter(content);\n\n items.push({\n type,\n name: path.basename(file, '.md'),\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n alwaysApply: this.extractAlwaysApply(frontmatter),\n });\n }\n\n return items;\n }\n\n /**\n * Generate stub file content with @ reference\n */\n generateStubContent(\n ide: MigrateIDE,\n sourceItem: SourceContentItem\n ): string {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) throw new Error(`Unknown IDE: ${ide}`);\n\n // Generate IDE-specific frontmatter\n const frontmatter = config.generateFrontmatter({\n description: sourceItem.description,\n globs: sourceItem.globs,\n alwaysApply: sourceItem.alwaysApply,\n sourceFile: sourceItem.relativePath,\n });\n\n // Generate @ reference\n const reference = `@${sourceItem.relativePath}`;\n\n // Combine frontmatter and reference\n if (frontmatter) {\n return `${frontmatter}\\n\\n${reference}\\n`;\n }\n return `${reference}\\n`;\n }\n\n /**\n * Migrate content to specific IDEs\n */\n async migrate(\n ides: MigrateIDE[],\n contentTypes: MigrateContentType[],\n content: ScanSummary,\n onProgress?: (result: MigrationResult) => void\n ): Promise<MigrationResult[]> {\n const results: MigrationResult[] = [];\n\n for (const ide of ides) {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) continue;\n\n // Migrate each content type\n for (const type of contentTypes) {\n const items = type === 'rules' ? content.rules :\n type === 'workflows' ? content.workflows :\n content.commands;\n\n for (const item of items) {\n const result = await this.migrateItem(ide, config, item);\n results.push(result);\n onProgress?.(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Migrate a single item\n */\n private async migrateItem(\n ide: MigrateIDE,\n config: IDEMigrationConfig,\n item: SourceContentItem\n ): Promise<MigrationResult> {\n try {\n // Determine target path\n const targetPath = this.getTargetPath(config, item);\n\n if (!targetPath) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'skipped',\n error: `IDE ${config.id} does not support ${item.type}`,\n };\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n await fs.mkdir(targetDir, { recursive: true });\n\n // Check if file exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(targetPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate stub content\n const stubContent = this.generateStubContent(ide, item);\n\n // Write file\n await fs.writeFile(targetPath, stubContent, 'utf-8');\n\n return {\n source: item,\n targetIDE: ide,\n targetPath,\n status,\n };\n } catch (error) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get target file path for an item\n */\n private getTargetPath(config: IDEMigrationConfig, item: SourceContentItem): string | null {\n let contentPath: string | null = null;\n\n switch (item.type) {\n case 'rules':\n contentPath = config.rulesPath;\n break;\n case 'workflows':\n contentPath = config.workflowsPath;\n break;\n case 'commands':\n contentPath = config.commandsPath;\n break;\n }\n\n if (!contentPath) {\n return null;\n }\n\n const filename = `${item.name}${config.fileExtension}`;\n return path.join(this.projectPath, config.basePath, contentPath, filename);\n }\n\n // Helper methods\n private extractGlobs(frontmatter: Record<string, unknown>): string[] | undefined {\n const globs = frontmatter.globs;\n if (typeof globs === 'string') return [globs];\n if (Array.isArray(globs)) return globs as string[];\n return undefined;\n }\n\n private extractAlwaysApply(frontmatter: Record<string, unknown>): boolean {\n return frontmatter.alwaysApply === true ||\n frontmatter.trigger === 'always' ||\n frontmatter.trigger === 'always_on';\n }\n}\n","/**\n * IDE migration configurations\n */\nimport type { IDEMigrationConfig, FrontmatterOptions, MigrateIDE } from '../types/migrate-ide.types.js';\n\nexport const IDE_MIGRATION_CONFIGS: Record<MigrateIDE, IDEMigrationConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.mdc',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n if (opts.globs && opts.globs.length > 0) {\n lines.push(`globs: ${opts.globs.join(', ')}`);\n }\n lines.push(`alwaysApply: ${opts.alwaysApply}`);\n lines.push('---');\n return lines.join('\\n');\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '🚀',\n basePath: '.agent',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n claudecode: {\n id: 'claudecode',\n name: 'Claude Code',\n icon: '🤖',\n basePath: '.claude',\n rulesPath: null,\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n if (opts.description) {\n return `---\\ndescription: ${opts.description}\\n---`;\n }\n return '';\n },\n },\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n icon: '💻',\n basePath: '.opencode',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n};\n\nexport function getMigrationIDEs(): MigrateIDE[] {\n return Object.keys(IDE_MIGRATION_CONFIGS) as MigrateIDE[];\n}\n\nexport function getIDEConfig(ide: MigrateIDE): IDEMigrationConfig | undefined {\n return IDE_MIGRATION_CONFIGS[ide];\n}\n","/**\n * Learn Command\n * Interactive guide center for Agentic Coding\n * \n * Renamed from 'guide' to 'learn' for clarity and brevity\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create learn command - Agentic Coding guide center\n */\nexport function createLearnCommand(): Command {\n const cmd = new Command('learn')\n .description('Interactive Agentic Coding learning center')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { MenuView } from './views/MenuView.js';\nimport { IntroView } from './views/IntroView.js';\nimport { RulesView } from './views/RulesView.js';\nimport { WorkflowsView } from './views/WorkflowsView.js';\nimport { PromptsView } from './views/PromptsView.js';\nimport { SkillsView } from './views/SkillsView.js';\nimport { AgenticGuideView } from './views/AgenticGuideView.js';\n\nexport type GuideTopic = 'menu' | 'intro' | 'rules' | 'workflows' | 'prompts' | 'skills' | 'agentic';\n\ninterface GuideAppProps {\n initialTopic?: string;\n onExit: () => void;\n}\n\nconst TOPIC_MAP: Record<string, GuideTopic> = {\n intro: 'intro',\n rules: 'rules',\n workflows: 'workflows',\n prompts: 'prompts',\n skills: 'skills',\n agentic: 'agentic',\n};\n\n/**\n * GuideApp - Interactive Agentic Coding Guide Center\n */\nexport const GuideApp: React.FC<GuideAppProps> = ({ initialTopic, onExit }) => {\n const { exit } = useApp();\n const [currentTopic, setCurrentTopic] = useState<GuideTopic>('menu');\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Set initial topic from CLI option\n useEffect(() => {\n if (initialTopic && TOPIC_MAP[initialTopic]) {\n setCurrentTopic(TOPIC_MAP[initialTopic]!);\n }\n }, [initialTopic]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape or Backspace to go back to menu\n if (key.escape || (currentTopic !== 'menu' && key.backspace)) {\n if (currentTopic === 'menu') {\n onExit();\n } else {\n setCurrentTopic('menu');\n setScrollPosition(0);\n }\n return;\n }\n\n // q to quit\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Scroll in content views\n if (currentTopic !== 'menu' && currentTopic !== 'agentic') {\n if (key.upArrow) {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollPosition(prev => prev + 1);\n } else if (key.pageDown) {\n setScrollPosition(prev => prev + 5);\n } else if (key.pageUp) {\n setScrollPosition(prev => Math.max(0, prev - 5));\n }\n }\n });\n\n const handleSelectTopic = (topic: GuideTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n };\n\n const handleBack = () => {\n setCurrentTopic('menu');\n setScrollPosition(0);\n };\n\n // Render appropriate view\n const renderContent = () => {\n switch (currentTopic) {\n case 'menu':\n return <MenuView onSelect={handleSelectTopic} />;\n case 'intro':\n return <IntroView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'rules':\n return <RulesView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'workflows':\n return <WorkflowsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'prompts':\n return <PromptsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'skills':\n return <SkillsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'agentic':\n return <AgenticGuideView onBack={handleBack} />;\n default:\n return <MenuView onSelect={handleSelectTopic} />;\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">🎓 Jai1 Guide</Text>\n <Text dimColor> - Trung tâm hướng dẫn Agentic Coding</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {currentTopic === 'menu'\n ? '[↑↓] Chọn · [Enter] Mở · [q] Thoát'\n : '[↑↓/PgUp/PgDn] Cuộn · [Esc/←] Quay lại · [q] Thoát'\n }\n </Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { GuideTopic } from '../GuideApp.js';\n\ninterface MenuViewProps {\n onSelect: (topic: GuideTopic) => void;\n}\n\ninterface MenuItem {\n id: GuideTopic;\n icon: string;\n title: string;\n description: string;\n badge?: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n {\n id: 'intro',\n icon: '📖',\n title: 'Giới thiệu Agentic Coding',\n description: 'Tổng quan về AI-assisted development và Jai1 Framework',\n },\n {\n id: 'rules',\n icon: '📜',\n title: 'IDE Rules',\n description: 'Quy tắc hướng dẫn AI hiểu context dự án của bạn',\n },\n {\n id: 'workflows',\n icon: '🔄',\n title: 'Workflows',\n description: 'Quy trình làm việc step-by-step (Cursor: Commands)',\n },\n {\n id: 'prompts',\n icon: '💬',\n title: 'Prompts',\n description: 'Cách viết prompts hiệu quả cho AI',\n },\n {\n id: 'skills',\n icon: '🛠',\n title: 'Skills',\n description: 'Mở rộng khả năng AI với skills chuyên biệt',\n },\n {\n id: 'agentic',\n icon: '🤖',\n title: 'Agentic Guide',\n description: 'Hỏi đáp trực tiếp với AI (interactive Q&A)',\n badge: 'Beta',\n },\n];\n\n/**\n * MenuView - Main menu showing all guide topics\n */\nexport const MenuView: React.FC<MenuViewProps> = ({ onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(MENU_ITEMS.length - 1, prev + 1));\n } else if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item) {\n onSelect(item.id);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"magenta\">Jai1 Guide</Text>!</Text>\n <Text dimColor>\n Đây là trung tâm hướng dẫn giúp bạn làm chủ Agentic Coding -\n </Text>\n <Text dimColor>\n phương pháp phát triển phần mềm với sự hỗ trợ của AI.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn chủ đề để tìm hiểu:</Text>\n\n {MENU_ITEMS.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.badge && (\n <Text color=\"yellow\" dimColor> [{item.badge}]</Text>\n )}\n {isSelected && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n <Box marginTop={1}>\n <Text dimColor>💡 Tip: Dùng </Text>\n <Text color=\"cyan\">jai1 guide --topic rules</Text>\n <Text dimColor> để mở trực tiếp một chủ đề</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface IntroViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst INTRO_CONTENT = [\n {\n type: 'header' as const,\n text: '📖 Giới thiệu Agentic Coding',\n },\n {\n type: 'section' as const,\n title: 'Agentic Coding là gì?',\n content: `Agentic Coding (hay Agentic Software Development - ASD) là phương pháp \nphát triển phần mềm với sự hỗ trợ của AI agents. AI không chỉ suggest code, \nmà còn chủ động:\n • Đọc và hiểu codebase của bạn\n • Thực thi commands và scripts\n • Tạo, sửa, xóa files\n • Chạy tests và debug\n • Tương tác với terminal và browser`,\n },\n {\n type: 'section' as const,\n title: 'Jai1 Framework là gì?',\n content: `Jai1 là framework giúp bạn làm việc hiệu quả với AI agents trong các IDE:\n • Cursor\n • Windsurf \n • Claude Code\n • GitHub Copilot Workspace\n • Codeium\n\nFramework cung cấp:\n 📜 Rules - Quy tắc hướng dẫn AI hiểu dự án\n 🔄 Workflows - Quy trình làm việc step-by-step\n 💬 Prompts - Templates prompts hiệu quả\n 🛠 Skills - Mở rộng khả năng AI`,\n },\n {\n type: 'section' as const,\n title: 'Tại sao cần Jai1?',\n content: `AI agents mạnh mẽ, nhưng cần \"context\" để làm việc hiệu quả:\n \n ❌ Không có context:\n \"Tạo một API endpoint\" → AI không biết tech stack, conventions\n\n ✅ Có Jai1 Framework:\n \"Tạo một API endpoint\" → AI đọc rules, hiểu bạn dùng HonoJS,\n biết cấu trúc thư mục, coding conventions, tự động follow best practices`,\n },\n {\n type: 'section' as const,\n title: 'Bắt đầu nhanh',\n content: `1. Khởi tạo Jai1 trong dự án:\n $ jai1 init\n\n2. Cài đặt components cần thiết:\n $ jai1 apply\n\n3. Sử dụng workflows trong IDE:\n Gõ @workflow hoặc /workflow để trigger\n\n4. Tùy chỉnh rules theo dự án của bạn:\n Sửa files trong .jai1/rules/`,\n },\n {\n type: 'tip' as const,\n text: 'Tiếp theo, tìm hiểu về Rules - nền tảng quan trọng nhất của Agentic Coding!',\n },\n];\n\n/**\n * IntroView - Introduction to Agentic Coding\n */\nexport const IntroView: React.FC<IntroViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={INTRO_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ContentItem {\n type: 'header' | 'section' | 'tip' | 'warning';\n text?: string;\n title?: string;\n content?: string;\n}\n\ninterface ContentViewProps {\n content: ContentItem[];\n scrollPosition: number;\n}\n\n/**\n * ContentView - Scrollable content container for guide views\n */\nexport const ContentView: React.FC<ContentViewProps> = ({ content, scrollPosition }) => {\n // Flatten content into lines for scrolling\n const renderContent = () => {\n const lines: React.ReactNode[] = [];\n\n content.forEach((item, idx) => {\n switch (item.type) {\n case 'header':\n lines.push(\n <Box key={`header-${idx}`} marginBottom={1}>\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={2}\n paddingY={0}\n >\n <Text bold color=\"magenta\">{item.text}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'section':\n lines.push(\n <Box key={`section-${idx}`} flexDirection=\"column\" marginBottom={1}>\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n <Text bold color=\"cyan\">{item.title}</Text>\n </Box>\n <Box marginLeft={1} marginTop={1}>\n <Text>{item.content}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'tip':\n lines.push(\n <Box\n key={`tip-${idx}`}\n borderStyle=\"round\"\n borderColor=\"green\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"green\">💡 Tip: {item.text}</Text>\n </Box>\n );\n break;\n\n case 'warning':\n lines.push(\n <Box\n key={`warning-${idx}`}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"yellow\">⚠️ Lưu ý: {item.text}</Text>\n </Box>\n );\n break;\n }\n });\n\n return lines;\n };\n\n const allLines = renderContent();\n const visibleLines = allLines.slice(scrollPosition, scrollPosition + 15);\n const hasMore = scrollPosition + 15 < allLines.length;\n const hasPrevious = scrollPosition > 0;\n\n return (\n <Box flexDirection=\"column\">\n {/* Scroll indicator top */}\n {hasPrevious && (\n <Box justifyContent=\"center\">\n <Text dimColor>↑ Cuộn lên để xem thêm</Text>\n </Box>\n )}\n\n {/* Content */}\n <Box flexDirection=\"column\">\n {visibleLines}\n </Box>\n\n {/* Scroll indicator bottom */}\n {hasMore && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>↓ Cuộn xuống để xem thêm ({allLines.length - scrollPosition - 15} items)</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface RulesViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst RULES_CONTENT = [\n {\n type: 'header' as const,\n text: '📜 IDE Rules - Quy tắc cho AI',\n },\n {\n type: 'section' as const,\n title: 'Rules là gì?',\n content: `Rules là các file Markdown chứa hướng dẫn cho AI agent. \nChúng giúp AI hiểu:\n • Tech stack của dự án (Laravel, NestJS, React...)\n • Coding conventions (naming, patterns...)\n • Cấu trúc thư mục và architecture\n • Business logic và domain knowledge`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Thư mục │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Rules │ .cursor/rules/ │\n│ Windsurf │ Rules │ .windsurf/rules/ │\n│ Antigravity │ Rules │ .agent/rules/ │\n│ Claude Code │ CLAUDE.md │ CLAUDE.md (root) │\n│ Copilot │ Instructions │ .github/copilot/ │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Rule file',\n content: `---\ndescription: [Mô tả ngắn khi nào rule này được apply]\nglobs: [Optional - file patterns để auto-apply]\n---\n\n# Tên Rule\n\n## Purpose\nGiải thích mục đích của rule\n\n## Conventions\nCác quy tắc cần tuân theo\n\n## Examples\nVí dụ minh họa (nếu cần)`,\n },\n {\n type: 'section' as const,\n title: 'Các loại Rules',\n content: `1. Global Rules (always active)\n • Conventions chung của dự án\n • Tech stack và dependencies\n • Coding style guidelines\n\n2. Contextual Rules (auto-applied by globs)\n • Frontend rules (cho *.tsx, *.vue...)\n • Backend rules (cho routes, controllers...)\n • Testing rules (cho *.test.*, *.spec.*)\n\n3. On-demand Rules\n • Gọi khi cần bằng @ruleName\n • Ví dụ: @database-migration, @api-design`,\n },\n {\n type: 'section' as const,\n title: 'Best Practices',\n content: `✅ DO:\n • Viết rules ngắn gọn, dễ đọc\n • Focus vào \"what to do\", không phải \"how to do\"\n • Cập nhật rules khi dự án thay đổi\n • Chia nhỏ rules theo domain/feature\n\n❌ DON'T:\n • Viết rules quá dài (>1000 tokens)\n • Copy-paste toàn bộ documentation\n • Include code examples quá chi tiết\n • Hardcode paths hoặc values`,\n },\n {\n type: 'tip' as const,\n text: 'Dùng \"jai1 apply rules/...\" để cài đặt rules mẫu cho tech stack của bạn!',\n },\n];\n\n/**\n * RulesView - Guide for IDE Rules\n */\nexport const RulesView: React.FC<RulesViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={RULES_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface WorkflowsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst WORKFLOWS_CONTENT = [\n {\n type: 'header' as const,\n text: '🔄 Workflows - Quy trình làm việc',\n },\n {\n type: 'section' as const,\n title: 'Workflows là gì?',\n content: `Workflows là tập hợp các bước tuần tự để AI thực hiện một tác vụ phức tạp.\nThay vì viết prompt dài dòng, bạn chỉ cần trigger workflow.\n\nVí dụ: /develop-feature\n → AI tự động: đọc task → plan → code → test → commit`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Cách trigger │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Commands │ / hoặc @command │\n│ Windsurf │ Workflows │ @workflow │\n│ Antigravity │ Workflows │ /workflow │\n│ Claude Code │ (Manual) │ Gọi CLAUDE.md │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc Workflow file',\n content: `---\ndescription: [Mô tả ngắn về workflow]\n---\n\n# Tên Workflow\n\n## ⚠️ CRITICAL RULES\nCác quy tắc bắt buộc phải tuân theo\n\n## 🎯 INPUT\nNhững gì cần có trước khi bắt đầu\n\n## 🔄 WORKFLOW PHASES\n### Phase 1: [Tên phase]\n- Step-by-step instructions\n- Commands to run\n- Validations to check\n\n### Phase 2: [Tên phase]\n...\n\n## ✅ QUALITY CHECKLIST\nChecklist kiểm tra khi hoàn thành`,\n },\n {\n type: 'section' as const,\n title: 'Workflows có sẵn trong Jai1',\n content: `/develop-feature Phát triển feature mới với auto-implement\n/fix-feature Sửa bugs với root cause analysis\n/commit-it Safe commit với security checks\n/gen-single-docs Generate documentation cho feature\n/setup-honojs Setup HonoJS + Drizzle cho dự án\n/create-prd Tạo Product Requirements Document`,\n },\n {\n type: 'section' as const,\n title: 'Đặc điểm của Workflow tốt',\n content: `✅ Continuous Execution\n • AI chạy liền mạch, không dừng hỏi user trừ khi thật sự cần\n\n✅ Progress Tracking\n • Tạo todo.md để track tiến độ\n • Hỗ trợ auto-resume từ checkpoint\n\n✅ Quality Gates\n • Có validation ở mỗi phase\n • Checklist kiểm tra cuối cùng\n\n✅ Error Handling\n • Xử lý errors gracefully\n • Có rollback plan khi thất bại`,\n },\n {\n type: 'tip' as const,\n text: 'Workflows mạnh nhất khi kết hợp với Rules - AI sẽ follow cả quy trình lẫn conventions!',\n },\n];\n\n/**\n * WorkflowsView - Guide for Workflows\n */\nexport const WorkflowsView: React.FC<WorkflowsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={WORKFLOWS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface PromptsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst PROMPTS_CONTENT = [\n {\n type: 'header' as const,\n text: '💬 Prompts - Giao tiếp hiệu quả với AI',\n },\n {\n type: 'section' as const,\n title: 'Prompts trong Agentic Coding',\n content: `Trong Agentic Coding, prompts không chỉ là \"hỏi một câu\" - \nmà là cách bạn định hướng AI thực hiện công việc phức tạp.\n\nVới Jai1 Framework, AI đã có sẵn context từ Rules,\nnên prompts của bạn có thể ngắn gọn và tập trung vào mục đích.`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Patterns hiệu quả',\n content: `1. ⚡ Quick Task Pattern\n \"Tạo API endpoint cho user registration\"\n → AI tự áp dụng conventions từ rules\n\n2. 📋 Task with Context Pattern \n \"Tạo API endpoint cho user registration.\n Bảng users: id, email, password_hash, created_at\"\n → Thêm context cụ thể cho task\n\n3. 🔄 Workflow Trigger Pattern\n \"@workflow develop-feature: Implement user login\"\n → Trigger toàn bộ workflow\n\n4. 🎯 Constraint Pattern\n \"Refactor UserService. Giữ nguyên public interface, \n chỉ extract private methods\"\n → Định rõ giới hạn`,\n },\n {\n type: 'section' as const,\n title: 'DO vs DON\\'T',\n content: `✅ NÊN:\n • Nêu rõ mục đích (\"để làm gì\")\n • Cung cấp context cụ thể\n • Định scope rõ ràng\n • Mention files/functions liên quan\n\n❌ KHÔNG NÊN:\n • Viết quá dài (AI mất focus)\n • Yêu cầu mơ hồ (\"fix bugs\")\n • Giả định AI biết context không có trong rules\n • Hỏi nhiều việc trong 1 prompt`,\n },\n {\n type: 'section' as const,\n title: 'Levels of Prompting',\n content: `Level 1: Simple (có Rules)\n \"Tạo model Product\"\n → AI follow conventions từ rules\n\nLevel 2: Guided (có context)\n \"Tạo model Product với: name, price, category_id, status\"\n → AI có thêm thông tin cụ thể\n\nLevel 3: Workflow\n \"@workflow: develop-feature Product CRUD\"\n → AI chạy toàn bộ quy trình\n\nLevel 4: Collaborative\n Chat multi-turn với AI để refine solution\n → Phù hợp với complex problems`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Templates trong Jai1',\n content: `Jai1 cung cấp prompt templates cho các use cases phổ biến:\n\n prompts/code-review.md Review và improve code\n prompts/debug-issue.md Debug với context đầy đủ\n prompts/explain-code.md Giải thích code cho team\n prompts/refactor.md Refactor patterns\n \nCài đặt: jai1 apply prompts/...`,\n },\n {\n type: 'tip' as const,\n text: 'Prompts ngắn + Rules tốt = Kết quả chính xác nhất!',\n },\n];\n\n/**\n * PromptsView - Guide for effective prompts\n */\nexport const PromptsView: React.FC<PromptsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={PROMPTS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface SkillsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst SKILLS_CONTENT = [\n {\n type: 'header' as const,\n text: '🛠 Skills - Mở rộng khả năng AI',\n },\n {\n type: 'section' as const,\n title: 'Skills là gì?',\n content: `Skills là \"kỹ năng\" chuyên biệt mà AI có thể học và sử dụng.\nMỗi skill là một gói hướng dẫn chi tiết cho một tác vụ cụ thể.\n\nKhác với Rules (context chung) và Workflows (quy trình):\n • Rules: \"Dự án dùng Laravel, naming convention như này...\"\n • Workflows: \"Để phát triển feature, làm theo các bước 1-2-3...\"\n • Skills: \"Để generate commit message, phân tích diff như này...\"`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Skill',\n content: `skills/\n└── skill-name/\n ├── SKILL.md # Main instruction file\n ├── scripts/ # Scripts hỗ trợ (optional)\n ├── references/ # Reference materials (optional)\n └── assets/ # Assets như templates (optional)\n\nSKILL.md format:\n---\nname: skill-name\ndescription: Mô tả ngắn\ntriggers: [patterns kích hoạt skill]\n---\n\n## Purpose\n## Steps\n## Examples`,\n },\n {\n type: 'section' as const,\n title: 'Skills có sẵn trong Jai1',\n content: `🎯 Development Skills:\n gen-commit-message Tạo commit message từ staged changes\n gen-prd Generate Product Requirements Document\n skill-creator Hướng dẫn tạo skill mới\n\n🖼 Media Skills:\n merge-mp4-files Merge video files với ffmpeg\n vid-scene-gen Generate video scene prompts\n\n📝 Documentation Skills:\n gen-frd Generate Functional Requirements Doc\n gen-tdd Generate Technical Design Doc`,\n },\n {\n type: 'section' as const,\n title: 'Cách sử dụng Skills',\n content: `1. Trigger bằng pattern:\n \"skill:gen-commit-message\"\n \"Dùng skill gen-commit-message để tạo message\"\n\n2. Kết hợp với Workflow:\n Workflows có thể gọi skills bên trong các phase\n\n3. Direct call trong chat:\n \"@skill/gen-commit-message\" (tùy IDE)`,\n },\n {\n type: 'section' as const,\n title: 'Tạo Skill mới',\n content: `Dùng workflow skill-creator:\n\n1. Xác định use case cụ thể\n2. Viết SKILL.md với format chuẩn\n3. Thêm scripts/references nếu cần\n4. Test với AI\n\nBest Practices:\n ✅ Skill nên focused vào 1 task\n ✅ Steps rõ ràng, actionable\n ✅ Có examples minh họa\n ❌ Không làm skill quá generic`,\n },\n {\n type: 'tip' as const,\n text: 'Skills giống như teaching AI một kỹ năng mới - càng chi tiết, AI càng làm tốt!',\n },\n];\n\n/**\n * SkillsView - Guide for Skills\n */\nexport const SkillsView: React.FC<SkillsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={SKILLS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport Spinner from 'ink-spinner';\n\ninterface AgenticGuideViewProps {\n onBack: () => void;\n}\n\ninterface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: Date;\n}\n\n// Suggested questions for quick access\nconst SUGGESTED_QUESTIONS = [\n 'Rules là gì?',\n 'Setup Jai1',\n 'Best practices workflows',\n 'Rules vs Skills',\n];\n\n// Mock responses\nconst MOCK_RESPONSES: Record<string, string> = {\n 'rules': `Rules là các file Markdown định nghĩa context cho AI.\nGiúp AI hiểu tech stack, conventions, architecture.\nVị trí: .cursor/rules/, .windsurf/rules/\nTip: Chạy \"jai1 apply rules/\" để cài rules mẫu!`,\n\n 'setup': `Setup Jai1:\n1. jai1 init\n2. jai1 apply (chọn components)\n3. jai1 vscode sync\n4. Tùy chỉnh .jai1/rules/ theo dự án`,\n\n 'workflows': `Best Practices Workflows:\n• Continuous execution (không dừng hỏi user)\n• Progress tracking với todo.md\n• Chia nhỏ thành phases rõ ràng\n• Quality gates ở mỗi phase`,\n\n 'skills': `Rules vs Skills:\n• Rules: Context chung, always active\n• Skills: Kỹ năng chuyên biệt, on-demand\nDùng cả hai: Rules cho context, Skills cho actions!`,\n\n 'default': `Tôi có thể trả lời về:\n• Rules - Quy tắc cho AI\n• Workflows - Quy trình làm việc\n• Skills - Kỹ năng mở rộng\n• Setup - Cài đặt Jai1\n\nThử hỏi: \"Rules là gì?\" hoặc \"Setup Jai1\"`,\n};\n\nfunction getMockResponse(message: string): string {\n const lower = message.toLowerCase();\n\n if (lower.includes('rule') || lower.includes('quy tắc')) {\n return MOCK_RESPONSES['rules']!;\n }\n if (lower.includes('setup') || lower.includes('init') || lower.includes('cài đặt')) {\n return MOCK_RESPONSES['setup']!;\n }\n if (lower.includes('workflow') || lower.includes('quy trình')) {\n return MOCK_RESPONSES['workflows']!;\n }\n if (lower.includes('skill') || lower.includes('khác')) {\n return MOCK_RESPONSES['skills']!;\n }\n\n return MOCK_RESPONSES['default']!;\n}\n\n/**\n * AgenticGuideView - Interactive Chat UI for AI Q&A\n */\nexport const AgenticGuideView: React.FC<AgenticGuideViewProps> = ({ onBack }) => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: 'welcome',\n role: 'system',\n content: 'Chào mừng đến Agentic Guide! Hỏi về Agentic Coding.',\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState('');\n const [isTyping, setIsTyping] = useState(false);\n const [selectedSuggestion, setSelectedSuggestion] = useState(0);\n const [focusArea, setFocusArea] = useState<'suggestions' | 'input'>('input');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape to go back\n if (key.escape) {\n onBack();\n return;\n }\n\n // Tab to switch focus\n if (key.tab) {\n setFocusArea(prev => prev === 'input' ? 'suggestions' : 'input');\n return;\n }\n\n // Handle suggestions navigation when focused\n if (focusArea === 'suggestions') {\n if (key.leftArrow) {\n setSelectedSuggestion(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedSuggestion(prev => Math.min(SUGGESTED_QUESTIONS.length - 1, prev + 1));\n } else if (key.return) {\n const question = SUGGESTED_QUESTIONS[selectedSuggestion];\n if (question) {\n handleSendMessage(question);\n setFocusArea('input');\n }\n }\n }\n });\n\n // Send message handler\n const handleSendMessage = async (text: string) => {\n if (!text.trim() || isTyping) return;\n\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInputValue('');\n setIsTyping(true);\n\n // Simulate AI thinking delay\n await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 700));\n\n const response = getMockResponse(text);\n\n const assistantMessage: ChatMessage = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response,\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, assistantMessage]);\n setIsTyping(false);\n };\n\n // Handle input submit\n const handleSubmit = (value: string) => {\n handleSendMessage(value);\n };\n\n // Render message content with proper line breaks\n const renderMessageContent = (content: string) => {\n const lines = content.split('\\n');\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n };\n\n // Get visible messages (last 4 to prevent overflow)\n const visibleMessages = messages.slice(-4);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color=\"magenta\">🤖 Agentic Guide</Text>\n <Text dimColor> - Hỏi đáp AI</Text>\n <Box flexGrow={1} />\n <Text backgroundColor=\"green\" color=\"black\" bold> BETA </Text>\n </Box>\n\n {/* Chat Messages Area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n minHeight={10}\n >\n {visibleMessages.map((msg) => (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={1}>\n {msg.role === 'user' ? (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>Bạn:</Text>\n <Box marginLeft={2}>\n <Text>{msg.content}</Text>\n </Box>\n </Box>\n ) : msg.role === 'assistant' ? (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>AI:</Text>\n <Box marginLeft={2}>\n {renderMessageContent(msg.content)}\n </Box>\n </Box>\n ) : (\n <Box>\n <Text dimColor italic>{msg.content}</Text>\n </Box>\n )}\n </Box>\n ))}\n\n {/* Typing indicator */}\n {isTyping && (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" /> AI đang trả lời...\n </Text>\n </Box>\n )}\n\n {/* Scroll hint */}\n {messages.length > 4 && (\n <Box justifyContent=\"center\">\n <Text dimColor>({messages.length - 4} tin nhắn trước)</Text>\n </Box>\n )}\n </Box>\n\n {/* Suggested Questions */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor bold>💡 Gợi ý:</Text>\n <Box marginTop={1}>\n {SUGGESTED_QUESTIONS.map((q, i) => {\n const isSelected = focusArea === 'suggestions' && i === selectedSuggestion;\n return (\n <Box key={i} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n {isSelected ? '❯' : ' '} {i + 1}. {q}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Input Box */}\n <Box\n borderStyle=\"round\"\n borderColor={focusArea === 'input' ? 'cyan' : 'gray'}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={focusArea === 'input' ? 'cyan' : 'gray'}>❯ </Text>\n {focusArea === 'input' ? (\n <TextInput\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder=\"Nhập câu hỏi...\"\n focus={true}\n />\n ) : (\n <Text dimColor>Nhấn Tab để nhập...</Text>\n )}\n </Box>\n\n {/* Help */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Chuyển · [Enter] Gửi/Chọn · [←→] Di chuyển gợi ý · [Esc] Quay lại\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Chat Command\n * Interactive chat with Jai1 LLM Proxy\n * Fullscreen terminal experience\n */\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ChatApp } from '../ui/llm/LlmApp.js';\nimport { ValidationError } from '../errors/index.js';\n\ninterface ChatCommandOptions {\n model?: string;\n}\n\n/**\n * Handle chat command\n */\nasync function handleChatCommand(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Render fullscreen app\n const { waitUntilExit, clear } = render(\n React.createElement(ChatApp, {\n service,\n initialModel: options.model,\n }),\n {\n // Enable fullscreen mode - clears terminal on exit\n exitOnCtrlC: false, // We handle exit via Esc\n }\n );\n\n await waitUntilExit();\n\n // Clear screen on exit for clean terminal\n clear();\n}\n\n/**\n * Create chat command\n */\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('Interactive AI chat with Jai1 LLM Proxy')\n .option('--model <model>', 'Initial model to use (e.g., gpt-4o, claude-3-opus)')\n .action(async (options: ChatCommandOptions) => {\n await handleChatCommand(options);\n });\n\n return cmd;\n}\n","/**\n * LLM Proxy Service\n * Client for interacting with Jai1 LLM proxy API\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport type {\n ModelsResponse,\n UserLimits,\n UsageStats,\n CompletionMessage,\n ChatCompletionChunk,\n ModelWithUsage,\n} from '../types/llm.types.js';\n\nexport class LlmProxyService {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: Jai1Config) {\n // Remove trailing slash if present\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.accessKey;\n }\n\n /**\n * Get the base URL for the LLM proxy (OpenAI-compatible endpoint)\n */\n getBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Fetch available models\n */\n async getModels(): Promise<ModelsResponse> {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Fetch user limits\n */\n async getLimits(): Promise<UserLimits> {\n const response = await fetch(`${this.baseUrl}/v1/me/limits`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch limits: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result?.data ?? { effectiveAllowedModels: [], effectiveRateLimits: {} };\n }\n\n /**\n * Fetch usage statistics\n */\n async getUsage(days = 7): Promise<UsageStats> {\n const response = await fetch(`${this.baseUrl}/v1/me/usage?days=${days}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch usage: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Get models with usage information\n */\n async getModelsWithUsage(): Promise<ModelWithUsage[]> {\n const [modelsRes, limits, usage] = await Promise.all([\n this.getModels(),\n this.getLimits(),\n this.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n const modelsData = modelsRes.data ?? [];\n\n return modelsData.map((model) => {\n const allowed = limits.effectiveAllowedModels?.includes(model.id) ?? false;\n const dailyLimit = limits.effectiveRateLimits?.[model.id] ?? limits.effectiveRateLimits?.[model.id.toLowerCase()];\n\n // Find usage record - try exact match first, then case-insensitive\n const usageData = usage.data ?? [];\n const usageRecord = usageData.find(\n (u) => u.model === model.id && u.date === today\n ) || usageData.find(\n (u) => u.model.toLowerCase() === model.id.toLowerCase() && u.date === today\n );\n const usedToday = usageRecord?.count || 0;\n\n return {\n ...model,\n allowed,\n dailyLimit,\n usedToday,\n };\n });\n }\n\n /**\n * Non-streaming chat completion (for translation and complete responses)\n * @returns Complete response content\n */\n async chat(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): Promise<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n const result = await response.json();\n return result.choices[0]?.message?.content || '';\n }\n\n /**\n * Stream chat completion\n * @yields Streamed text chunks\n */\n async *chatStream(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): AsyncGenerator<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed('Failed to parse SSE chunk:', e);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate sample cURL command\n */\n generateCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey.slice(0, 12)}...\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n\n /**\n * Generate full cURL command with actual API key\n */\n generateFullCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n}\n","/**\n * ChatApp - Main LLM Proxy Chat Application\n * Interactive TUI for chatting with LLM API\n * Simple layout to avoid re-render flickering\n */\nimport React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { LlmProxyService } from '../../services/llm-proxy.service.js';\nimport { useChat } from './hooks/useChat.js';\nimport { useLlmApi } from './hooks/useLlmApi.js';\nimport { ChatPanel } from './components/ChatPanel.js';\nimport { ModelSelector } from './components/ModelSelector.js';\nimport { SlashCommand } from './components/SlashCommandMenu.js';\n\n// Available slash commands - defined outside component to prevent recreation\nconst SLASH_COMMANDS: SlashCommand[] = [\n { name: 'model', description: 'Change the AI model', aliases: ['m'] },\n { name: 'stats', description: 'Show model usage statistics', aliases: ['s'] },\n { name: 'quit', description: 'Exit the chat', aliases: ['q', 'exit'] },\n];\n\ninterface ChatAppProps {\n service: LlmProxyService;\n initialModel?: string;\n}\n\ntype ViewType = 'loading' | 'chat' | 'model' | 'stats' | 'error';\n\nexport const ChatApp: React.FC<ChatAppProps> = ({ service, initialModel }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Capture terminal inner height once on mount (subtract header + footer = ~6 lines)\n const contentHeight = useRef(Math.max(10, (stdout?.rows || 24) - 6));\n\n // Core state\n const [currentView, setCurrentView] = useState<ViewType>('loading');\n const [showSlashMenu, setShowSlashMenu] = useState(false);\n const [slashMenuIndex, setSlashMenuIndex] = useState(0);\n const [inputValue, setInputValue] = useState('');\n const [selectedModel, setSelectedModel] = useState<string>('');\n\n // API data\n const { models, loading, error, refetch } = useLlmApi(service);\n\n // Chat state\n const { messages, isStreaming, sendMessage } = useChat(service);\n\n // Set initial model when loaded, or show error\n useEffect(() => {\n if (error && !loading) {\n setCurrentView('error');\n return;\n }\n if (models.length > 0 && !selectedModel) {\n const first = models.find((m) => m.allowed);\n if (first) {\n setSelectedModel(initialModel || first.id);\n setCurrentView('chat');\n }\n }\n }, [models, selectedModel, initialModel, error, loading]);\n\n // Filter commands based on input\n const filteredCommands = useMemo(() => {\n if (!inputValue.startsWith('/')) return SLASH_COMMANDS;\n const filter = inputValue.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (cmd) => cmd.name.includes(filter) || cmd.aliases?.some((a) => a.includes(filter))\n );\n }, [inputValue]);\n\n // Handlers\n const cycleModel = useCallback(() => {\n const allowed = models.filter((m) => m.allowed);\n if (allowed.length === 0) return;\n const idx = allowed.findIndex((m) => m.id === selectedModel);\n setSelectedModel(allowed[(idx + 1) % allowed.length]!.id);\n }, [models, selectedModel]);\n\n const execCommand = useCallback((cmd: string) => {\n const c = cmd.toLowerCase().replace(/^\\//, '');\n if (c === 'model' || c === 'm') { setCurrentView('model'); return true; }\n if (c === 'stats' || c === 's') { setCurrentView('stats'); refetch(); return true; }\n if (c === 'quit' || c === 'q' || c === 'exit') { exit(); return true; }\n return false;\n }, [refetch, exit]);\n\n // Keyboard input\n useInput((input, key) => {\n if (showSlashMenu) {\n if (key.upArrow) { setSlashMenuIndex((i) => Math.max(0, i - 1)); return; }\n if (key.downArrow) { setSlashMenuIndex((i) => Math.min(filteredCommands.length - 1, i + 1)); return; }\n if (key.return && filteredCommands[slashMenuIndex]) {\n setShowSlashMenu(false);\n execCommand(filteredCommands[slashMenuIndex].name);\n setInputValue('');\n return;\n }\n }\n if (key.escape) {\n if (showSlashMenu) { setShowSlashMenu(false); setInputValue(''); }\n else if (currentView !== 'chat' && currentView !== 'loading' && currentView !== 'error') { setCurrentView('chat'); }\n else { exit(); }\n return;\n }\n // Allow retry on error view with Enter or 'r'\n if (currentView === 'error' && (key.return || input === 'r')) {\n setCurrentView('loading');\n refetch();\n return;\n }\n if (key.tab && currentView === 'chat' && !showSlashMenu && !isStreaming) {\n cycleModel();\n }\n }, { isActive: true });\n\n const onInputChange = useCallback((v: string) => {\n setInputValue(v);\n const show = v.startsWith('/');\n setShowSlashMenu(show);\n if (show && v === '/') setSlashMenuIndex(0);\n }, []);\n\n const onSubmit = useCallback((v: string) => {\n const t = v.trim();\n setShowSlashMenu(false);\n if (t.startsWith('/') && execCommand(t)) { setInputValue(''); return; }\n if (t && !isStreaming && selectedModel) { sendMessage(t, selectedModel); setInputValue(''); }\n }, [execCommand, isStreaming, selectedModel, sendMessage]);\n\n const onSelectModel = useCallback((id: string) => {\n setSelectedModel(id);\n setCurrentView('chat');\n }, []);\n\n // Render stats\n const statsView = useMemo(() => {\n const allowed = models.filter((m) => m.allowed);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">📊 Model Usage Statistics</Text>\n {allowed.map((m) => {\n const limit = m.dailyLimit ?? 0;\n const used = m.usedToday ?? 0;\n const pct = limit > 0 ? Math.round((used / limit) * 100) : 0;\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return (\n <Box key={m.id} flexDirection=\"column\">\n <Text color={m.id === selectedModel ? 'yellow' : 'white'}>\n {m.id === selectedModel ? '► ' : ' '}{m.id}\n </Text>\n <Text color={pct > 80 ? 'red' : pct > 50 ? 'yellow' : 'green'}>\n {' '}{bar} <Text dimColor>{used}/{limit}</Text>\n </Text>\n </Box>\n );\n })}\n <Text dimColor>[Esc] Back</Text>\n </Box>\n );\n }, [models, selectedModel]);\n\n // Footer text\n const footer = currentView === 'error'\n ? '[Enter/r] Retry • [Esc] Quit'\n : currentView === 'model' || currentView === 'stats'\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Back'\n : showSlashMenu\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Cancel'\n : '[Tab] Next Model • [/] Commands • [Esc] Quit';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box borderStyle=\"double\" borderColor=\"magenta\" paddingX={1}>\n <Text bold color=\"magenta\">🤖 Jai1 Chat</Text>\n <Box flexGrow={1} />\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\" bold>{selectedModel || '...'}</Text>\n </Box>\n\n {/* Content */}\n {currentView === 'loading' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\">\n <Text><Spinner type=\"dots\" /> Loading...</Text>\n </Box>\n ) : currentView === 'error' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\" flexDirection=\"column\">\n <Text color=\"red\" bold>Connection Error</Text>\n <Text color=\"red\">{error}</Text>\n <Text dimColor> </Text>\n <Text dimColor>Press Enter or 'r' to retry</Text>\n </Box>\n ) : currentView === 'model' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n <ModelSelector\n models={models}\n currentModel={selectedModel}\n onSelect={onSelectModel}\n onCancel={() => setCurrentView('chat')}\n />\n </Box>\n ) : currentView === 'stats' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n {statsView}\n </Box>\n ) : (\n <ChatPanel\n messages={messages}\n isStreaming={isStreaming}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onSubmit={onSubmit}\n inputFocused={!showSlashMenu}\n showSlashMenu={showSlashMenu}\n slashCommands={filteredCommands}\n slashMenuIndex={slashMenuIndex}\n minHeight={contentHeight.current}\n />\n )}\n\n {/* Footer */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * useChat hook\n * Manages chat state and streaming responses\n */\nimport { useState, useCallback } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ChatMessage, CompletionMessage } from '../../../types/llm.types.js';\n\nexport function useChat(service: LlmProxyService) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendMessage = useCallback(\n async (content: string, model: string) => {\n if (!content.trim() || isStreaming) return;\n\n // Add user message\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant message placeholder\n const assistantMessageId = `assistant-${Date.now()}`;\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n try {\n // Convert chat messages to completion messages\n const completionMessages: CompletionMessage[] = [\n ...messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n {\n role: 'user' as const,\n content: content.trim(),\n },\n ];\n\n // Stream response\n let fullContent = '';\n for await (const chunk of service.chatStream(completionMessages, model)) {\n fullContent += chunk;\n\n // Update message content incrementally\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: fullContent }\n : msg\n )\n );\n }\n\n setIsStreaming(false);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n\n // Update last message with error\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: `Error: ${errorMessage}` }\n : msg\n )\n );\n\n setIsStreaming(false);\n }\n },\n [service, messages, isStreaming]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n clearMessages,\n };\n}\n","/**\n * useLlmApi hook\n * Manages LLM API data fetching and state\n * Only fetches once on mount - use refetch for manual updates\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ModelWithUsage, UserLimits, UsageStats } from '../../../types/llm.types.js';\n\ninterface LlmApiState {\n models: ModelWithUsage[];\n limits: UserLimits | null;\n usage: UsageStats | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useLlmApi(service: LlmProxyService) {\n const [state, setState] = useState<LlmApiState>({\n models: [],\n limits: null,\n usage: null,\n loading: true,\n error: null,\n });\n\n // Track if we've already fetched\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async (showLoading = false) => {\n // Show loading and clear error on fetch\n if (showLoading) {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n }\n\n try {\n const [models, limits, usage] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n service.getUsage(7),\n ]);\n\n setState({\n models,\n limits,\n usage,\n loading: false,\n error: null,\n });\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }));\n }\n }, [service]);\n\n // Only fetch once on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData(true);\n }\n }, []);\n\n // Refetch with loading state (for retry after error)\n const refetch = useCallback(() => {\n fetchData(true);\n }, [fetchData]);\n\n return {\n ...state,\n refetch,\n };\n}\n","/**\n * ChatPanel component\n * Simple, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { MessageItem } from './MessageItem.js';\nimport { InputBox } from './InputBox.js';\nimport { SlashCommand } from './SlashCommandMenu.js';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface ChatPanelProps {\n messages: ChatMessage[];\n isStreaming: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputFocused?: boolean;\n showSlashMenu?: boolean;\n slashCommands?: SlashCommand[];\n slashMenuIndex?: number;\n minHeight?: number;\n}\n\n// Memoized message list to prevent re-renders\nconst MessageList = memo(({ messages }: { messages: ChatMessage[] }) => {\n const visible = messages.slice(-8);\n const hidden = messages.length - visible.length;\n\n if (visible.length === 0) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={1}>\n <Text dimColor>Start a conversation...</Text>\n <Text dimColor>Type / for commands</Text>\n </Box>\n );\n }\n\n return (\n <>\n {hidden > 0 && <Text dimColor>({hidden} earlier)</Text>}\n {visible.map((m) => <MessageItem key={m.id} message={m} />)}\n </>\n );\n});\n\n// Memoized slash menu\nconst SlashMenu = memo(({ commands, index }: { commands: SlashCommand[]; index: number }) => (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">Commands</Text>\n {commands.map((cmd, i) => (\n <Text\n key={cmd.name}\n backgroundColor={i === index ? 'cyan' : undefined}\n color={i === index ? 'black' : 'white'}\n >\n {i === index ? '› ' : ' '}/{cmd.name} - {cmd.description}\n </Text>\n ))}\n </Box>\n));\n\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n messages,\n isStreaming,\n inputValue,\n onInputChange,\n onSubmit,\n inputFocused = true,\n showSlashMenu = false,\n slashCommands = [],\n slashMenuIndex = 0,\n minHeight = 15,\n}) => {\n // Subtract space for input box (~3 lines) and slash menu if shown (~5 lines)\n const messagesMinHeight = Math.max(5, minHeight - 4 - (showSlashMenu ? 5 : 0));\n\n return (\n <Box flexDirection=\"column\">\n {/* Messages */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} minHeight={messagesMinHeight}>\n <MessageList messages={messages} />\n {isStreaming && (\n <Text color=\"green\"><Spinner type=\"dots\" /> Responding...</Text>\n )}\n </Box>\n\n {/* Slash menu */}\n {showSlashMenu && slashCommands.length > 0 && (\n <SlashMenu commands={slashCommands} index={slashMenuIndex} />\n )}\n\n {/* Input */}\n <InputBox\n value={inputValue}\n onChange={onInputChange}\n onSubmit={onSubmit}\n disabled={isStreaming}\n focused={inputFocused}\n />\n </Box>\n );\n};\n","/**\n * MessageItem component\n * Memoized to prevent re-renders\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface MessageItemProps {\n message: ChatMessage;\n}\n\nexport const MessageItem = memo<MessageItemProps>(({ message }) => {\n if (message.role === 'user') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"cyan\" bold>You:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n if (message.role === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"green\" bold>Jai1:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>{message.content}</Text>\n </Box>\n );\n});\n","/**\n * InputBox component\n * Memoized, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface InputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n disabled?: boolean;\n focused?: boolean;\n}\n\nexport const InputBox = memo<InputBoxProps>(({\n value,\n onChange,\n onSubmit,\n disabled = false,\n focused = true,\n}) => (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">❯ </Text>\n {!disabled ? (\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder=\"Type your message...\"\n focus={focused}\n />\n ) : (\n <Text dimColor>Waiting...</Text>\n )}\n </Box>\n));\n","/**\n * ModelSelector component\n * Overlay for selecting LLM model\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelWithUsage } from '../../../types/llm.types.js';\n\ninterface ModelSelectorProps {\n models: ModelWithUsage[];\n currentModel: string;\n onSelect: (modelId: string) => void;\n onCancel: () => void;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n currentModel,\n onSelect,\n onCancel,\n}) => {\n const allowedModels = models.filter((m) => m.allowed);\n const currentIndex = allowedModels.findIndex((m) => m.id === currentModel);\n const [selectedIndex, setSelectedIndex] = useState(Math.max(0, currentIndex));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(allowedModels.length - 1, prev + 1));\n } else if (key.return) {\n const selected = allowedModels[selectedIndex];\n if (selected) {\n onSelect(selected.id);\n }\n }\n });\n\n if (allowedModels.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n padding={1}\n width={60}\n >\n <Text color=\"red\" bold>\n No models available\n </Text>\n <Text dimColor>Press Esc to close</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n width={70}\n >\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ Select Model\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n {allowedModels.map((model, i) => {\n const isSelected = i === selectedIndex;\n const isCurrent = model.id === currentModel;\n const icon = isSelected ? '●' : '○';\n\n let usageText = '';\n if (model.dailyLimit !== undefined && model.usedToday !== undefined) {\n usageText = ` (${model.usedToday}/${model.dailyLimit})`;\n }\n\n return (\n <Box key={model.id} marginY={0}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'white'}\n >\n {isSelected ? '❯ ' : ' '}\n {icon} {model.id}\n {isCurrent ? ' ✓' : ''}\n {usageText}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[↑↓] Navigate [Enter] Select [Esc] Cancel</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * OpenAI Keys Command\n * Show OpenAI-compatible API credentials and info\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 8) + '****' + key.slice(-4);\n}\n\n/**\n * Handle openai-keys command\n */\nasync function handleOpenAiKeysCommand(options: { full?: boolean }): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📡 Jai1 LLM Proxy - OpenAI Compatible API');\n console.log('─────────────────────────────────────────\\n');\n\n console.log('🔑 API Credentials');\n console.log(` BASE_URL: ${service.getBaseUrl()}`);\n console.log(` API_KEY: ${options.full ? service.getApiKey() : maskKey(service.getApiKey())}\\n`);\n\n try {\n const [models, limits] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n ]);\n\n const allowedModels = models.filter((m) => m.allowed);\n\n console.log('📦 Available Models');\n if (allowedModels.length === 0) {\n console.log(' No models available\\n');\n } else {\n allowedModels.forEach((model) => {\n const usageText =\n model.dailyLimit !== undefined && model.usedToday !== undefined\n ? ` (${model.usedToday}/${model.dailyLimit} today)`\n : '';\n console.log(` ✓ ${model.id}${usageText}`);\n });\n console.log();\n }\n\n const defaultModel = allowedModels[0]?.id || 'gpt-4o';\n console.log('📝 Sample cURL\\n');\n const curlSample = options.full\n ? service.generateFullCurlSample(defaultModel)\n : service.generateCurlSample(defaultModel);\n const curlLines = curlSample.split('\\n');\n curlLines.forEach((line) => console.log(` ${line}`));\n console.log();\n\n console.log('💡 Usage:');\n console.log(' - Use as drop-in replacement for OpenAI API');\n console.log(' - Compatible with: OpenAI SDK, LangChain, LlamaIndex, etc.');\n console.log(' - Run \"jai1 chat\" for interactive mode');\n console.log(' - Run \"jai1 openai-keys --full\" to show full API key');\n } catch (error) {\n console.error(\n '\\n❌ Failed to fetch API info:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Check your API URL and access key with \"jai1 status\"');\n }\n}\n\n/**\n * Create openai-keys command\n */\nexport function createOpenAiKeysCommand(): Command {\n const cmd = new Command('openai-keys')\n .description('Show OpenAI-compatible API credentials and info')\n .option('--full', 'Show full API key (unmasked)')\n .action(async (options: { full?: boolean }) => {\n await handleOpenAiKeysCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Stats Command\n * Show LLM usage statistics and limits\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport type { UsageRecord } from '../types/llm.types.js';\n\n/**\n * Handle stats command\n */\nasync function handleStatsCommand(): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Vui lòng chạy \"jai1 auth\" trước.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📊 Thống Kê Sử Dụng LLM');\n console.log('─────────────────────────────────────────\\n');\n\n try {\n // Fetch data in parallel\n const [limits, usage7Days, usageToday] = await Promise.all([\n service.getLimits(),\n service.getUsage(7),\n service.getUsage(1),\n ]);\n\n // Get today's date in GMT+7 timezone\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n\n console.log('📅 Khoảng thời gian: 7 ngày qua\\n');\n\n // Process usage data\n const usageByModel = new Map<string, { today: number; total7Days: number }>();\n\n // Calculate 7-day totals\n let total7DaysRequests = 0;\n usage7Days.data?.forEach((record: UsageRecord) => {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.total7Days += record.count;\n total7DaysRequests += record.count;\n });\n\n // Add today's usage\n usageToday.data?.forEach((record: UsageRecord) => {\n if (record.date === today) {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.today = record.count;\n }\n });\n\n // Display total summary\n console.log('📈 Tổng quan sử dụng');\n console.log(` Tổng số yêu cầu (7 ngày): ${total7DaysRequests}\\n`);\n\n // Display per-model table\n console.log('📦 Thống kê theo model\\n');\n console.log('┌─────────────────────────────────┬──────────────┬──────────────┬──────────────┐');\n console.log('│ Model │ Hôm nay │ Giới hạn │ Tổng 7 ngày │');\n console.log('├─────────────────────────────────┼──────────────┼──────────────┼──────────────┤');\n\n // Get all models from limits\n const allowedModels = limits.effectiveAllowedModels || [];\n const rateLimits = limits.effectiveRateLimits || {};\n\n if (allowedModels.length === 0) {\n console.log('│ Không có model nào khả dụng │');\n } else {\n allowedModels.forEach((modelId: string) => {\n const usage = usageByModel.get(modelId) || { today: 0, total7Days: 0 };\n const limit = rateLimits[modelId] || rateLimits[modelId.toLowerCase()] || 0;\n\n // Format columns with proper padding\n const modelCol = modelId.padEnd(31);\n const todayCol = `${usage.today}/${limit}`.padEnd(12);\n const limitCol = `${limit}/ngày`.padEnd(12);\n const totalCol = String(usage.total7Days).padEnd(12);\n\n console.log(`│ ${modelCol} │ ${todayCol} │ ${limitCol} │ ${totalCol} │`);\n });\n }\n\n console.log('└─────────────────────────────────┴──────────────┴──────────────┴──────────────┘');\n console.log('\\n💡 Mẹo: Chạy \"jai1 openai-keys\" để xem danh sách model khả dụng');\n } catch (error) {\n console.error(\n '\\n❌ Không thể lấy thống kê:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Kiểm tra kết nối API với \"jai1 status\"');\n }\n}\n\n/**\n * Create stats command\n */\nexport function createStatsCommand(): Command {\n const cmd = new Command('stats')\n .description('Hiển thị thống kê sử dụng LLM và giới hạn')\n .action(async () => {\n await handleStatsCommand();\n });\n\n return cmd;\n}\n","/**\n * Translate Command\n * Translate text, files, or folders using LLM Proxy\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { TranslationService } from '../services/translation.service.js';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\nimport type { TranslateOptions } from '../types/translate.types.js';\n\ninterface TranslateCommandOptions extends TranslateOptions {\n model?: string;\n}\n\n/**\n * Handle translate command\n */\nasync function handleTranslate(input: string, options: TranslateCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Chạy \"jai1 auth\" trước.');\n }\n\n const llmService = new LlmProxyService(config);\n const translationService = new TranslationService(llmService, options, options.model);\n\n // Detect input type\n const inputType = await translationService.detectInputType(input);\n\n // Handle based on type\n switch (inputType) {\n case 'text':\n await handleTextTranslation(translationService, input, options);\n break;\n case 'file':\n await handleFileTranslation(translationService, input, options);\n break;\n case 'folder':\n await handleFolderTranslation(translationService, input, options);\n break;\n }\n}\n\n/**\n * Handle text translation\n */\nasync function handleTextTranslation(\n service: TranslationService,\n text: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log('🌐 Đang dịch văn bản...');\n }\n\n const result = await service.translateText(text);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success && result.translatedContent) {\n console.log(`✅ Hoàn tất! Ngôn ngữ: ${result.targetLanguage}\\n`);\n console.log(result.translatedContent);\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle file translation\n */\nasync function handleFileTranslation(\n service: TranslationService,\n filePath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang dịch file: ${filePath}`);\n }\n\n const result = await service.translateFile(filePath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success) {\n if (options.dryRun) {\n console.log(`✅ Preview mode - sẽ lưu: ${result.outputPath}`);\n } else {\n console.log(`✅ Đã lưu: ${result.outputPath}`);\n }\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle folder translation\n */\nasync function handleFolderTranslation(\n service: TranslationService,\n folderPath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang quét thư mục: ${folderPath}\\n`);\n }\n\n const result = await service.translateFolder(folderPath, (progress) => {\n if (!options.json) {\n const fileName = progress.currentFile.split('/').pop() || progress.currentFile;\n process.stdout.write(\n `\\r🌐 Đang xử lý: ${progress.current}/${progress.total} - ${fileName}${' '.repeat(20)}`\n );\n }\n });\n\n if (!options.json) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(100) + '\\r');\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display summary\n console.log(`\\n✅ Hoàn tất! ${result.summary.success}/${result.summary.total} file đã dịch`);\n\n if (result.summary.failed > 0) {\n console.log(`\\n⚠️ ${result.summary.failed} file gặp lỗi:`);\n result.results\n .filter((r) => !r.success)\n .forEach((r) => {\n const fileName = r.inputPath.split('/').pop() || r.inputPath;\n console.log(` ❌ ${fileName}: ${r.error}`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n💡 Chạy không có --dry-run để lưu file.');\n }\n}\n\n/**\n * Create translate command\n */\nexport function createTranslateCommand(): Command {\n const cmd = new Command('translate')\n .description('Dịch văn bản, file hoặc thư mục bằng AI')\n .argument('<input>', 'Chuỗi văn bản, đường dẫn file hoặc thư mục')\n .option('--to <language>', 'Mã ngôn ngữ đích (mặc định: vi)', 'vi')\n .option('-o, --output <path>', 'Đường dẫn output (file/thư mục)')\n .option('--dry-run', 'Xem trước không lưu file')\n .option('--concurrency <number>', 'Số file xử lý song song (mặc định: 3)', '3')\n .option('--model <model>', 'Model LLM (mặc định: gpt-5.1-codex-mini)')\n .option('--json', 'Xuất kết quả dạng JSON')\n .action(async (input: string, options: TranslateCommandOptions) => {\n await handleTranslate(input, options);\n });\n\n return cmd;\n}\n","/**\n * Translation Service\n * Handles translation of text, files, and folders using LLM Proxy\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { LlmProxyService } from './llm-proxy.service.js';\nimport type { CompletionMessage } from '../types/llm.types.js';\nimport type {\n TranslateOptions,\n TranslationResult,\n FileTranslationResult,\n FolderTranslationResult,\n TranslationProgress,\n TRANSLATABLE_EXTENSIONS,\n TranslatableExtension,\n} from '../types/translate.types.js';\n\nconst TRANSLATABLE_EXTS = ['.md', '.txt', '.json', '.yaml', '.yml'] as const;\n\nexport class TranslationService {\n private readonly llmService: LlmProxyService;\n private readonly options: TranslateOptions;\n private readonly model: string;\n\n constructor(llmService: LlmProxyService, options: TranslateOptions, model?: string) {\n this.llmService = llmService;\n this.options = options;\n this.model = model || 'gpt-5.1-codex-mini'; // Default fast model for translation\n }\n\n /**\n * Detect input type\n */\n async detectInputType(input: string): Promise<'text' | 'file' | 'folder'> {\n try {\n const stat = await fs.stat(input);\n if (stat.isDirectory()) return 'folder';\n if (stat.isFile()) return 'file';\n } catch {\n // Path doesn't exist, treat as text\n }\n return 'text';\n }\n\n /**\n * Translate text string\n */\n async translateText(text: string): Promise<TranslationResult> {\n try {\n const translatedContent = await this.translateWithRetry(text, 'text');\n return {\n success: true,\n inputType: 'text',\n input: text,\n output: translatedContent,\n targetLanguage: this.options.to,\n translatedContent,\n };\n } catch (error) {\n return {\n success: false,\n inputType: 'text',\n input: text,\n output: '',\n targetLanguage: this.options.to,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate single file\n */\n async translateFile(filePath: string): Promise<FileTranslationResult> {\n try {\n // Read file content\n const content = await fs.readFile(filePath, 'utf-8');\n\n // Detect file type\n const ext = path.extname(filePath).toLowerCase();\n const fileType = this.getFileType(ext);\n\n // Translate content\n const translatedContent = await this.translateWithRetry(content, fileType);\n\n // Generate output path\n const outputPath = this.generateOutputPath(filePath);\n\n // Write output (unless dry-run)\n if (!this.options.dryRun) {\n await fs.writeFile(outputPath, translatedContent, 'utf-8');\n }\n\n return {\n inputPath: filePath,\n outputPath,\n success: true,\n };\n } catch (error) {\n return {\n inputPath: filePath,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate entire folder recursively\n */\n async translateFolder(\n folderPath: string,\n onProgress?: (progress: TranslationProgress) => void\n ): Promise<FolderTranslationResult> {\n const files = await this.discoverFiles(folderPath);\n const concurrency = parseInt(this.options.concurrency || '3', 10);\n const limit = pLimit(concurrency);\n\n const results: FileTranslationResult[] = [];\n let current = 0;\n\n const tasks = files.map((file) =>\n limit(async () => {\n current++;\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: 'translating',\n });\n\n const result = await this.translateFile(file);\n results.push(result);\n\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: result.success ? 'done' : 'error',\n });\n\n return result;\n })\n );\n\n await Promise.all(tasks);\n\n return this.summarizeResults(folderPath, results);\n }\n\n /**\n * Generate output path with language suffix\n */\n private generateOutputPath(inputPath: string): string {\n if (this.options.output) {\n return this.options.output;\n }\n\n const ext = path.extname(inputPath);\n const base = path.basename(inputPath, ext);\n const dir = path.dirname(inputPath);\n const lang = this.options.to;\n\n return path.join(dir, `${base}.${lang}${ext}`);\n }\n\n /**\n * Discover translatable files in folder recursively\n */\n private async discoverFiles(folderPath: string): Promise<string[]> {\n const entries = await fs.readdir(folderPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(folderPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subFiles = await this.discoverFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (TRANSLATABLE_EXTS.includes(ext as TranslatableExtension)) {\n // Skip already translated files (e.g., file.vi.md)\n if (!this.isTranslatedFile(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n return files;\n }\n\n /**\n * Check if filename indicates already translated file\n */\n private isTranslatedFile(filename: string): boolean {\n // Pattern: .{lang}.{ext} (e.g., .vi.md, .en.txt)\n const pattern = /\\.[a-z]{2}\\.(md|txt|json|ya?ml)$/i;\n return pattern.test(filename);\n }\n\n /**\n * Build translation prompt based on content type\n */\n private buildPrompt(content: string, fileType: string): CompletionMessage[] {\n const targetLang = this.options.to;\n let systemPrompt = '';\n\n switch (fileType) {\n case 'markdown':\n systemPrompt = `You are a professional translator.\nTranslate the following Markdown content to ${targetLang}.\nPreserve all formatting including:\n- Markdown syntax (headers, lists, code blocks, links, tables)\n- Line breaks and paragraph structure\n- Code snippets (do not translate code, only comments if present)\n- HTML tags if present\n\nReturn ONLY the translated content, no explanations.`;\n break;\n\n case 'json':\n systemPrompt = `You are translating a JSON localization file.\nTranslate all string values to ${targetLang}.\nPreserve the JSON structure and keys exactly.\nReturn valid JSON only, no explanations.`;\n break;\n\n case 'yaml':\n systemPrompt = `You are translating a YAML configuration file.\nTranslate all string values to ${targetLang}.\nPreserve the YAML structure and keys exactly.\nReturn valid YAML only, no explanations.`;\n break;\n\n default:\n systemPrompt = `You are a professional translator.\nTranslate the following text to ${targetLang}.\nPreserve all formatting and line breaks.\nReturn ONLY the translated content, no explanations.`;\n }\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: content },\n ];\n }\n\n /**\n * Get file type from extension\n */\n private getFileType(ext: string): string {\n switch (ext.toLowerCase()) {\n case '.md':\n return 'markdown';\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'text';\n }\n }\n\n /**\n * Translate with retry logic\n */\n private async translateWithRetry(content: string, fileType: string): Promise<string> {\n return pRetry(\n async () => {\n const messages = this.buildPrompt(content, fileType);\n const result = await this.llmService.chat(messages, this.model);\n return result;\n },\n {\n retries: 3,\n onFailedAttempt: (error) => {\n if (error.message.includes('rate limit')) {\n console.log('⚠️ Rate limit, đang thử lại...');\n }\n },\n }\n );\n }\n\n /**\n * Summarize folder translation results\n */\n private summarizeResults(\n folderPath: string,\n results: FileTranslationResult[]\n ): FolderTranslationResult {\n const summary = {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n skipped: 0,\n };\n\n return {\n inputFolder: folderPath,\n outputFolder: this.options.output || folderPath,\n results,\n summary,\n };\n }\n}\n","/**\n * Utils Command Group\n * Developer utilities for common tasks\n */\nimport { Command } from 'commander';\nimport { createPasswordCommand } from './password.js';\nimport { createUuidCommand } from './uuid.js';\nimport { createHashCommand } from './hash.js';\nimport { createBase64EncodeCommand } from './base64-encode.js';\nimport { createBase64DecodeCommand } from './base64-decode.js';\nimport { createHttpCommand } from './http.js';\nimport { createJwtCommand } from './jwt.js';\nimport { createUnixTimeCommand } from './unix-time.js';\nimport { createTimezoneCommand } from './timezone.js';\nimport { createUrlEncodeCommand } from './url-encode.js';\nimport { createUrlDecodeCommand } from './url-decode.js';\nimport { createCronCommand } from './cron.js';\nimport { createMarkdownPreviewCommand } from './markdown-preview.js';\nimport { runInteractiveMode } from './interactive.js';\n\n/**\n * Create utils command group\n * Subcommands:\n * - password: Generate secure passwords\n * - uuid: Generate UUID v4\n * - hash: Generate hash (MD5/SHA/bcrypt)\n * - base64-encode: Encode to Base64\n * - base64-decode: Decode from Base64\n * - http: Make HTTP requests\n * - jwt: Decode/encode JWT tokens\n * - unix-time: Convert unix timestamps\n * - timezone: Convert between timezones\n * - url-encode: Encode URL components\n * - url-decode: Decode URL components\n * - cron: Parse cron expressions\n * - markdown-preview: Preview markdown files\n */\nexport function createUtilsCommand(): Command {\n const utilsCommand = new Command('utils')\n .description('Developer utilities for common tasks')\n .option('-i, --interactive', 'Run in interactive mode')\n .addHelpText('after', `\nInteractive Mode:\n $ jai1 utils --interactive\n $ jai1 utils -i\n\nQuick Usage:\n $ jai1 utils password --length 24\n $ jai1 utils uuid --count 5\n $ jai1 utils hash \"text\" --algorithm sha256\n $ jai1 utils http https://api.example.com\n`);\n\n // Add all subcommands\n utilsCommand.addCommand(createPasswordCommand());\n utilsCommand.addCommand(createUuidCommand());\n utilsCommand.addCommand(createHashCommand());\n utilsCommand.addCommand(createBase64EncodeCommand());\n utilsCommand.addCommand(createBase64DecodeCommand());\n utilsCommand.addCommand(createHttpCommand());\n utilsCommand.addCommand(createJwtCommand());\n utilsCommand.addCommand(createUnixTimeCommand());\n utilsCommand.addCommand(createTimezoneCommand());\n utilsCommand.addCommand(createUrlEncodeCommand());\n utilsCommand.addCommand(createUrlDecodeCommand());\n utilsCommand.addCommand(createCronCommand());\n utilsCommand.addCommand(createMarkdownPreviewCommand());\n\n // Default action - interactive mode if no subcommand, otherwise show help\n utilsCommand.action(async (options) => {\n if (options.interactive) {\n await runInteractiveMode();\n } else {\n utilsCommand.help();\n }\n });\n\n return utilsCommand;\n}\n","/**\n * Password Generation Command\n * Generate secure random passwords\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handlePasswordGeneration(options: {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n count: number;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const passwords: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const password = service.generatePassword({\n length: options.length,\n lowercase: options.lowercase,\n uppercase: options.uppercase,\n digits: options.digits,\n symbols: options.symbols,\n symbolChars: options.symbolChars,\n });\n passwords.push(password);\n }\n\n console.log('🔐 Generated Password(s):');\n console.log('────────────────────────────────────────\\n');\n\n passwords.forEach((password, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${password}`);\n } else {\n console.log(` ${password}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createPasswordCommand(): Command {\n const cmd = new Command('password')\n .description('Generate secure random password')\n .option('-l, --length <number>', 'Password length', '16')\n .option('--no-lowercase', 'Exclude lowercase letters')\n .option('--no-uppercase', 'Exclude uppercase letters')\n .option('--no-digits', 'Exclude digits')\n .option('--no-symbols', 'Exclude symbols')\n .option('--symbol-chars <chars>', 'Custom symbol characters')\n .option('-c, --count <number>', 'Number of passwords to generate', '1')\n .addHelpText('after', `\nExamples:\n $ jai1 utils password\n $ jai1 utils password --length 24\n $ jai1 utils password --no-symbols\n $ jai1 utils password --count 5\n $ jai1 utils password -l 32 --no-digits\n`)\n .action(async (options) => {\n await handlePasswordGeneration({\n ...options,\n length: parseInt(options.length, 10),\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Utils Service\n * Core utility functions for developer tools\n */\nimport crypto from 'crypto';\nimport bcrypt from 'bcryptjs';\nimport { readFile } from 'fs/promises';\n\n// ============================================\n// TYPES\n// ============================================\n\nexport interface PasswordOptions {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n}\n\nexport interface UuidOptions {\n uppercase?: boolean;\n noHyphens?: boolean;\n}\n\nexport type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512' | 'bcrypt';\n\nexport interface HttpRequestOptions {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n followRedirects?: boolean;\n}\n\nexport interface HttpResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n size: number;\n}\n\n// ============================================\n// UTILS SERVICE\n// ============================================\n\nexport class UtilsService {\n /**\n * Generate secure random password\n */\n generatePassword(options: PasswordOptions): string {\n const {\n length,\n lowercase,\n uppercase,\n digits,\n symbols,\n symbolChars = '!@#$%^&*()_+-=[]{}|;:,.<>?'\n } = options;\n\n let charset = '';\n if (lowercase) charset += 'abcdefghijklmnopqrstuvwxyz';\n if (uppercase) charset += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (digits) charset += '0123456789';\n if (symbols) charset += symbolChars;\n\n if (charset.length === 0) {\n throw new Error('At least one character type must be enabled');\n }\n\n const randomBytes = crypto.randomBytes(length);\n let password = '';\n\n for (let i = 0; i < length; i++) {\n const randomIndex = randomBytes[i] % charset.length;\n password += charset[randomIndex];\n }\n\n return password;\n }\n\n /**\n * Generate UUID v4\n */\n generateUuid(options?: UuidOptions): string {\n let uuid = crypto.randomUUID();\n\n if (options?.uppercase) {\n uuid = uuid.toUpperCase();\n }\n\n if (options?.noHyphens) {\n uuid = uuid.replace(/-/g, '');\n }\n\n return uuid;\n }\n\n /**\n * Hash text or file using specified algorithm\n */\n async hash(input: string | Buffer, algorithm: HashAlgorithm): Promise<string> {\n if (algorithm === 'bcrypt') {\n throw new Error('Use hashBcrypt for bcrypt algorithm');\n }\n\n const hash = crypto.createHash(algorithm);\n hash.update(input);\n return hash.digest('hex');\n }\n\n /**\n * Hash file contents\n */\n async hashFile(filePath: string, algorithm: HashAlgorithm): Promise<string> {\n const content = await readFile(filePath);\n return this.hash(content, algorithm);\n }\n\n /**\n * Hash using bcrypt\n */\n async hashBcrypt(input: string, rounds: number = 10): Promise<string> {\n return bcrypt.hash(input, rounds);\n }\n\n /**\n * Base64 encode\n */\n base64Encode(input: string | Buffer, urlSafe: boolean = false): string {\n const buffer = typeof input === 'string' ? Buffer.from(input, 'utf-8') : input;\n let encoded = buffer.toString('base64');\n\n if (urlSafe) {\n encoded = encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n return encoded;\n }\n\n /**\n * Base64 decode\n */\n base64Decode(input: string): Buffer {\n // Handle URL-safe base64\n let normalized = input.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n while (normalized.length % 4) {\n normalized += '=';\n }\n\n return Buffer.from(normalized, 'base64');\n }\n\n /**\n * Make HTTP request with detailed output\n */\n async httpRequest(url: string, options: HttpRequestOptions): Promise<HttpResponse> {\n const startTime = performance.now();\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined,\n redirect: options.followRedirects === false ? 'manual' : 'follow',\n };\n\n const response = await fetch(url, fetchOptions);\n const body = await response.text();\n const endTime = performance.now();\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n timing: Math.round(endTime - startTime),\n size: Buffer.byteLength(body, 'utf-8'),\n };\n }\n\n /**\n * Decode JWT (no verification)\n */\n jwtDecode(token: string): { header: object; payload: object; signature: string } {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n const header = JSON.parse(this.base64Decode(headerB64).toString('utf-8'));\n const payload = JSON.parse(this.base64Decode(payloadB64).toString('utf-8'));\n\n return { header, payload, signature };\n }\n\n /**\n * Encode JWT (HS256 only)\n */\n jwtEncode(payload: object, secret: string, header?: object): string {\n const defaultHeader = { alg: 'HS256', typ: 'JWT' };\n const finalHeader = { ...defaultHeader, ...header };\n\n const headerB64 = this.base64Encode(JSON.stringify(finalHeader), true);\n const payloadB64 = this.base64Encode(JSON.stringify(payload), true);\n\n const signatureInput = `${headerB64}.${payloadB64}`;\n const signature = crypto\n .createHmac('sha256', secret)\n .update(signatureInput)\n .digest('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return `${headerB64}.${payloadB64}.${signature}`;\n }\n\n /**\n * Convert unix timestamp to date\n */\n unixToDate(timestamp: number, milliseconds: boolean = false): Date {\n return new Date(milliseconds ? timestamp : timestamp * 1000);\n }\n\n /**\n * Convert date to unix timestamp\n */\n dateToUnix(date: Date, milliseconds: boolean = false): number {\n const timestamp = date.getTime();\n return milliseconds ? timestamp : Math.floor(timestamp / 1000);\n }\n\n /**\n * Convert time between timezones\n */\n convertTimezone(\n time: Date | string,\n fromTimezone: string,\n toTimezone: string\n ): { time: string; iso: string } {\n const date = typeof time === 'string' ? new Date(time) : time;\n\n // Format in target timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: toTimezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(date);\n const dateParts = parts.reduce((acc, part) => {\n if (part.type !== 'literal') {\n acc[part.type] = part.value;\n }\n return acc;\n }, {} as Record<string, string>);\n\n const time24 = `${dateParts.year}-${dateParts.month}-${dateParts.day} ${dateParts.hour}:${dateParts.minute}:${dateParts.second}`;\n\n return {\n time: time24,\n iso: date.toISOString(),\n };\n }\n\n /**\n * Get list of available timezones\n */\n getTimezones(): string[] {\n // Common timezones\n return [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Sao_Paulo',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Europe/Moscow',\n 'Asia/Dubai',\n 'Asia/Kolkata',\n 'Asia/Bangkok',\n 'Asia/Shanghai',\n 'Asia/Tokyo',\n 'Asia/Seoul',\n 'Asia/Ho_Chi_Minh',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n ];\n }\n\n /**\n * URL encode\n */\n urlEncode(input: string, full: boolean = false): string {\n return full ? encodeURI(input) : encodeURIComponent(input);\n }\n\n /**\n * URL decode\n */\n urlDecode(input: string, full: boolean = false): string {\n return full ? decodeURI(input) : decodeURIComponent(input);\n }\n\n /**\n * Format bytes to human-readable size\n */\n formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;\n }\n}\n","/**\n * UUID Generation Command\n * Generate UUID v4 identifiers\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUuidGeneration(options: {\n count: number;\n uppercase: boolean;\n noHyphens: boolean;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const uuids: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const uuid = service.generateUuid({\n uppercase: options.uppercase,\n noHyphens: options.noHyphens,\n });\n uuids.push(uuid);\n }\n\n console.log('🆔 Generated UUID(s):');\n console.log('────────────────────────────────────────\\n');\n\n uuids.forEach((uuid, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${uuid}`);\n } else {\n console.log(` ${uuid}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUuidCommand(): Command {\n const cmd = new Command('uuid')\n .description('Generate UUID v4 identifier')\n .option('-c, --count <number>', 'Number of UUIDs to generate', '1')\n .option('--uppercase', 'Output in uppercase')\n .option('--no-hyphens', 'Remove hyphens from output')\n .addHelpText('after', `\nExamples:\n $ jai1 utils uuid\n $ jai1 utils uuid --count 10\n $ jai1 utils uuid --uppercase\n $ jai1 utils uuid --no-hyphens\n $ jai1 utils uuid --uppercase --no-hyphens\n`)\n .action(async (options) => {\n await handleUuidGeneration({\n ...options,\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Hash Generation Command\n * Generate hash using MD5, SHA, or bcrypt\n */\nimport { Command } from 'commander';\nimport { UtilsService, HashAlgorithm } from '../../services/utils.service.js';\n\nasync function handleHashGeneration(\n input: string | undefined,\n options: {\n algorithm: HashAlgorithm;\n file?: string;\n rounds: number;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let hash: string;\n\n if (options.file) {\n // Hash file contents\n if (options.algorithm === 'bcrypt') {\n console.error('❌ bcrypt cannot be used with files (it requires string input)');\n process.exit(1);\n }\n hash = await service.hashFile(options.file, options.algorithm);\n } else {\n // Hash text input\n if (!input) {\n console.error('❌ Please provide input text or use --file option');\n process.exit(1);\n }\n\n if (options.algorithm === 'bcrypt') {\n hash = await service.hashBcrypt(input, options.rounds);\n } else {\n hash = await service.hash(input, options.algorithm);\n }\n }\n\n console.log('🔒 Hash Result:');\n console.log('────────────────────────────────────────');\n console.log(` Algorithm: ${options.algorithm.toUpperCase()}`);\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.algorithm === 'bcrypt') {\n console.log(` Rounds: ${options.rounds}`);\n }\n console.log();\n console.log(` ${hash}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHashCommand(): Command {\n const cmd = new Command('hash')\n .description('Generate hash (MD5, SHA, bcrypt)')\n .argument('[input]', 'Text to hash')\n .option(\n '-a, --algorithm <algorithm>',\n 'Hash algorithm (md5, sha1, sha256, sha512, bcrypt)',\n 'sha256'\n )\n .option('-f, --file <path>', 'Hash file contents instead of text')\n .option('-r, --rounds <number>', 'Bcrypt rounds (only for bcrypt)', '10')\n .addHelpText('after', `\nExamples:\n $ jai1 utils hash \"hello world\"\n $ jai1 utils hash \"hello\" --algorithm md5\n $ jai1 utils hash \"password\" --algorithm bcrypt\n $ jai1 utils hash \"password\" --algorithm bcrypt --rounds 12\n $ jai1 utils hash --file ./myfile.txt\n $ jai1 utils hash --file ./image.png --algorithm sha512\n`)\n .action(async (input, options) => {\n await handleHashGeneration(input, {\n ...options,\n rounds: parseInt(options.rounds, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Base64 Encode Command\n * Encode text or files to Base64\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Encode(\n input: string | undefined,\n options: {\n file?: string;\n urlSafe: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encoded: string;\n\n if (options.file) {\n const content = await readFile(options.file);\n encoded = service.base64Encode(content, options.urlSafe);\n } else {\n if (!input) {\n console.error('❌ Please provide input text or use --file option');\n process.exit(1);\n }\n encoded = service.base64Encode(input, options.urlSafe);\n }\n\n console.log('📝 Base64 Encoded:');\n console.log('────────────────────────────────────────');\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.urlSafe) {\n console.log(` Format: URL-safe`);\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64EncodeCommand(): Command {\n const cmd = new Command('base64-encode')\n .description('Encode text or file to Base64')\n .argument('[input]', 'Text to encode')\n .option('-f, --file <path>', 'Encode file contents')\n .option('--url-safe', 'Use URL-safe Base64 encoding')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-encode \"hello world\"\n $ jai1 utils base64-encode \"hello world\" --url-safe\n $ jai1 utils base64-encode --file ./document.txt\n $ jai1 utils base64-encode --file ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Encode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Base64 Decode Command\n * Decode Base64 strings\n */\nimport { Command } from 'commander';\nimport { readFile, writeFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Decode(\n input: string | undefined,\n options: {\n file?: string;\n output?: string;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encodedInput: string;\n\n if (options.file) {\n encodedInput = await readFile(options.file, 'utf-8');\n } else {\n if (!input) {\n console.error('❌ Please provide Base64 input or use --file option');\n process.exit(1);\n }\n encodedInput = input;\n }\n\n const decoded = service.base64Decode(encodedInput.trim());\n\n if (options.output) {\n await writeFile(options.output, decoded);\n console.log('✅ Decoded and saved to:', options.output);\n } else {\n console.log('📝 Base64 Decoded:');\n console.log('────────────────────────────────────────');\n console.log();\n console.log(` ${decoded.toString('utf-8')}`);\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64DecodeCommand(): Command {\n const cmd = new Command('base64-decode')\n .description('Decode Base64 string')\n .argument('[input]', 'Base64 string to decode')\n .option('-f, --file <path>', 'Decode from file')\n .option('-o, --output <path>', 'Write decoded output to file')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-decode \"aGVsbG8gd29ybGQ=\"\n $ jai1 utils base64-decode --file ./encoded.txt\n $ jai1 utils base64-decode \"aGVsbG8=\" --output ./decoded.txt\n $ jai1 utils base64-decode --file ./encoded.txt --output ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Decode(input, options);\n });\n\n return cmd;\n}\n","/**\n * HTTP Request Command\n * Make HTTP requests with detailed output\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleHttpRequest(\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n file?: string;\n timeout: number;\n noFollow: boolean;\n onlyHeaders: boolean;\n onlyBody: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n // Parse headers\n const headers: Record<string, string> = {};\n if (options.header) {\n options.header.forEach((header) => {\n const [key, ...valueParts] = header.split(':');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(':').trim();\n }\n });\n }\n\n // Get body\n let body: string | undefined;\n if (options.file) {\n body = await readFile(options.file, 'utf-8');\n } else if (options.data) {\n body = options.data;\n }\n\n // Make request\n const response = await service.httpRequest(url, {\n method: options.method.toUpperCase(),\n headers,\n body,\n timeout: options.timeout,\n followRedirects: !options.noFollow,\n });\n\n // Display results\n if (!options.onlyBody) {\n console.log(`HTTP/${response.status >= 200 && response.status < 300 ? '1.1' : '1.0'} ${response.status} ${response.statusText}`);\n console.log('───────────────────────────────────────────');\n console.log(`📊 Status: ${response.status} ${response.statusText}`);\n console.log(`⏱️ Time: ${response.timing}ms`);\n console.log(`📦 Size: ${service.formatBytes(response.size)}`);\n console.log();\n }\n\n if (!options.onlyBody && !options.onlyHeaders) {\n console.log('📋 Headers:');\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(` ${key}: ${value}`);\n });\n console.log();\n }\n\n if (options.onlyHeaders) {\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(`${key}: ${value}`);\n });\n return;\n }\n\n if (!options.onlyHeaders) {\n if (!options.onlyBody) {\n console.log('📄 Body:');\n }\n\n // Try to format as JSON\n try {\n const json = JSON.parse(response.body);\n console.log(JSON.stringify(json, null, 2));\n } catch {\n console.log(response.body);\n }\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHttpCommand(): Command {\n const cmd = new Command('http')\n .description('Make HTTP request with formatted output')\n .argument('<url>', 'Target URL')\n .option('-X, --method <method>', 'HTTP method', 'GET')\n .option('-H, --header <header...>', 'Request headers (repeatable)')\n .option('-d, --data <data>', 'Request body (JSON string)')\n .option('--file <path>', 'Read body from file')\n .option('--timeout <ms>', 'Request timeout in milliseconds', '30000')\n .option('--no-follow', 'Do not follow redirects')\n .option('--only-headers', 'Show only response headers')\n .option('--only-body', 'Show only response body')\n .addHelpText('after', `\nExamples:\n $ jai1 utils http https://api.example.com/users\n $ jai1 utils http https://api.example.com/users -X POST -d '{\"name\":\"John\"}'\n $ jai1 utils http https://api.example.com -H \"Authorization: Bearer token123\"\n $ jai1 utils http https://api.example.com -H \"Content-Type: application/json\" -H \"Accept: application/json\"\n $ jai1 utils http https://api.example.com --timeout 5000\n $ jai1 utils http https://api.example.com --only-body\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (url, options) => {\n await handleHttpRequest(url, {\n ...options,\n timeout: parseInt(options.timeout, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * JWT Command\n * Decode and encode JWT tokens\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleJwtDecode(token: string): Promise<void> {\n const service = new UtilsService();\n\n try {\n const { header, payload, signature } = service.jwtDecode(token);\n\n console.log('🔓 JWT Decoded:');\n console.log('────────────────────────────────────────\\n');\n\n console.log('📋 Header:');\n console.log(JSON.stringify(header, null, 2));\n console.log();\n\n console.log('📄 Payload:');\n console.log(JSON.stringify(payload, null, 2));\n console.log();\n\n console.log('🔏 Signature:');\n console.log(` ${signature}`);\n console.log();\n\n console.log('⚠️ Note: Token signature is not verified');\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nasync function handleJwtEncode(options: {\n payload: string;\n secret: string;\n header?: string;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const payload = JSON.parse(options.payload);\n const header = options.header ? JSON.parse(options.header) : undefined;\n\n const token = service.jwtEncode(payload, options.secret, header);\n\n console.log('🔐 JWT Encoded:');\n console.log('────────────────────────────────────────\\n');\n console.log(` ${token}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createJwtCommand(): Command {\n const jwtCommand = new Command('jwt')\n .description('Decode and encode JWT tokens');\n\n // Decode subcommand\n jwtCommand\n .command('decode')\n .description('Decode JWT token')\n .argument('<token>', 'JWT token to decode')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt decode \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n $ jai1 utils jwt decode $JWT_TOKEN\n`)\n .action(async (token) => {\n await handleJwtDecode(token);\n });\n\n // Encode subcommand\n const encodeCommand = jwtCommand\n .command('encode')\n .description('Encode JWT token (HS256)')\n .requiredOption('-p, --payload <json>', 'Payload as JSON string')\n .requiredOption('-s, --secret <secret>', 'Secret key for signing')\n .option('-h, --header <json>', 'Custom header as JSON string')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt encode --payload '{\"sub\":\"123\",\"name\":\"John\"}' --secret \"mysecret\"\n $ jai1 utils jwt encode -p '{\"userId\":\"456\"}' -s \"key123\"\n $ jai1 utils jwt encode -p '{\"sub\":\"789\"}' -s \"secret\" -h '{\"alg\":\"HS256\",\"typ\":\"JWT\"}'\n`)\n .action(async (options) => {\n await handleJwtEncode(options);\n });\n\n // Show help on error for missing required options\n encodeCommand.showHelpAfterError('(add --help for additional examples)');\n\n return jwtCommand;\n}\n","/**\n * Unix Time Command\n * Convert unix timestamps to/from human-readable dates\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUnixTime(\n input: string | undefined,\n options: {\n format: 'iso' | 'local' | 'utc';\n ms: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (!input) {\n // Show current timestamp\n const now = new Date();\n const timestamp = service.dateToUnix(now, options.ms);\n\n console.log('🕒 Current Unix Timestamp:');\n console.log('────────────────────────────────────────');\n console.log(` ${timestamp}${options.ms ? ' (milliseconds)' : ''}`);\n console.log();\n console.log(` ISO: ${now.toISOString()}`);\n console.log(` Local: ${now.toLocaleString()}`);\n console.log();\n } else if (/^\\d+$/.test(input)) {\n // Convert unix timestamp to date\n const timestamp = parseInt(input, 10);\n const date = service.unixToDate(timestamp, options.ms);\n\n console.log('🕒 Unix Timestamp to Date:');\n console.log('────────────────────────────────────────');\n console.log(` Input: ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n\n if (options.format === 'iso' || options.format === 'utc') {\n console.log(` ${date.toISOString()}`);\n } else {\n console.log(` ${date.toLocaleString()}`);\n }\n console.log();\n } else {\n // Convert date string to unix timestamp\n const date = new Date(input);\n\n if (isNaN(date.getTime())) {\n console.error('❌ Invalid date format');\n process.exit(1);\n }\n\n const timestamp = service.dateToUnix(date, options.ms);\n\n console.log('🕒 Date to Unix Timestamp:');\n console.log('────────────────────────────────────────');\n console.log(` Input: ${input}`);\n console.log(` Parsed: ${date.toISOString()}`);\n console.log();\n console.log(` ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUnixTimeCommand(): Command {\n const cmd = new Command('unix-time')\n .description('Convert unix timestamps to/from dates')\n .argument('[input]', 'Unix timestamp or date string')\n .option('-f, --format <format>', 'Output format (iso, local, utc)', 'iso')\n .option('--ms', 'Use milliseconds instead of seconds')\n .addHelpText('after', `\nExamples:\n $ jai1 utils unix-time\n $ jai1 utils unix-time 1702550400\n $ jai1 utils unix-time 1702550400000 --ms\n $ jai1 utils unix-time \"2024-01-15 10:30:00\"\n $ jai1 utils unix-time \"2024-01-15\" --format local\n $ jai1 utils unix-time --ms\n`)\n .action(async (input, options) => {\n await handleUnixTime(input, options);\n });\n\n return cmd;\n}\n","/**\n * Timezone Command\n * Convert time between timezones\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleTimezoneConversion(\n time: string | undefined,\n options: {\n from: string;\n to: string;\n list: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (options.list) {\n console.log('🌍 Available Timezones:');\n console.log('────────────────────────────────────────\\n');\n\n const timezones = service.getTimezones();\n timezones.forEach((tz) => {\n console.log(` ${tz}`);\n });\n console.log();\n return;\n }\n\n if (!time) {\n console.error('❌ Please provide time to convert or use --list to see available timezones');\n process.exit(1);\n }\n\n if (!options.from || !options.to) {\n console.error('❌ Please provide both --from and --to timezones');\n process.exit(1);\n }\n\n const result = service.convertTimezone(time, options.from, options.to);\n\n console.log('🌍 Timezone Conversion:');\n console.log('────────────────────────────────────────');\n console.log(` From: ${options.from}`);\n console.log(` To: ${options.to}`);\n console.log();\n console.log(` ${result.time}`);\n console.log(` ISO: ${result.iso}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createTimezoneCommand(): Command {\n const cmd = new Command('timezone')\n .description('Convert time between timezones')\n .argument('[time]', 'Time to convert (e.g., \"2024-01-15 10:00\")')\n .option('--from <timezone>', 'Source timezone')\n .option('--to <timezone>', 'Target timezone')\n .option('--list', 'Show available timezones')\n .addHelpText('after', `\nExamples:\n $ jai1 utils timezone --list\n $ jai1 utils timezone \"2024-01-15 10:00\" --from \"America/New_York\" --to \"Asia/Tokyo\"\n $ jai1 utils timezone \"2024-01-15 14:30\" --from \"UTC\" --to \"America/Los_Angeles\"\n $ jai1 utils timezone \"2024-12-25 12:00\" --from \"Europe/London\" --to \"Asia/Ho_Chi_Minh\"\n`)\n .action(async (time, options) => {\n await handleTimezoneConversion(time, options);\n });\n\n return cmd;\n}\n","/**\n * URL Encode Command\n * Encode URL components or full URLs\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlEncode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const encoded = service.urlEncode(input, options.full);\n\n console.log('🔗 URL Encoded:');\n console.log('────────────────────────────────────────');\n if (options.full) {\n console.log(' Mode: Full URL (encodeURI)');\n } else {\n console.log(' Mode: Component (encodeURIComponent)');\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlEncodeCommand(): Command {\n const cmd = new Command('url-encode')\n .description('Encode URL component or full URL')\n .argument('<input>', 'Text to encode')\n .option('--full', 'Encode full URL (use encodeURI instead of encodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-encode \"hello world\"\n $ jai1 utils url-encode \"hello world & test\"\n $ jai1 utils url-encode \"name=John Doe&age=30\"\n $ jai1 utils url-encode \"https://example.com/path with spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlEncode(input, options);\n });\n\n return cmd;\n}\n","/**\n * URL Decode Command\n * Decode URL-encoded strings\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlDecode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const decoded = service.urlDecode(input, options.full);\n\n console.log('🔗 URL Decoded:');\n console.log('────────────────────────────────────────');\n if (options.full) {\n console.log(' Mode: Full URL (decodeURI)');\n } else {\n console.log(' Mode: Component (decodeURIComponent)');\n }\n console.log();\n console.log(` ${decoded}`);\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlDecodeCommand(): Command {\n const cmd = new Command('url-decode')\n .description('Decode URL-encoded string')\n .argument('<input>', 'Text to decode')\n .option('--full', 'Decode full URL (use decodeURI instead of decodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-decode \"hello%20world\"\n $ jai1 utils url-decode \"hello%20world%20%26%20test\"\n $ jai1 utils url-decode \"name%3DJohn%20Doe%26age%3D30\"\n $ jai1 utils url-decode \"https://example.com/path%20with%20spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlDecode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Cron Parser Command\n * Parse and explain cron expressions\n */\nimport { Command } from 'commander';\nimport cronstrue from 'cronstrue';\n\nasync function handleCronParse(expression: string): Promise<void> {\n try {\n // Parse cron expression to human-readable\n const description = cronstrue.toString(expression);\n\n console.log('⏰ Cron Expression Parser:');\n console.log('────────────────────────────────────────');\n console.log(` Expression: ${expression}`);\n console.log(` Meaning: ${description}`);\n console.log();\n\n // Calculate next 5 execution times\n console.log('📅 Next 5 Executions:');\n\n const parts = expression.trim().split(/\\s+/);\n if (parts.length < 5 || parts.length > 6) {\n console.log(' ⚠️ Invalid cron expression format');\n return;\n }\n\n // Simple calculation for next runs (approximate)\n const now = new Date();\n const executions: string[] = [];\n\n for (let i = 0; i < 5; i++) {\n const nextTime = new Date(now);\n nextTime.setDate(nextTime.getDate() + i);\n\n // Try to match hour and minute from cron\n const [minute, hour] = parts.slice(parts.length === 6 ? 1 : 0, parts.length === 6 ? 3 : 2);\n\n if (minute !== '*' && !minute.includes('/') && !minute.includes('-')) {\n nextTime.setMinutes(parseInt(minute, 10));\n }\n\n if (hour !== '*' && !hour.includes('/') && !hour.includes('-')) {\n nextTime.setHours(parseInt(hour, 10));\n }\n\n executions.push(\n ` ${i + 1}. ${nextTime.toISOString().replace('T', ' ').substring(0, 19)}`\n );\n }\n\n executions.forEach((exec) => console.log(exec));\n console.log();\n\n console.log('💡 Tip: This is an approximate calculation.');\n console.log(' For exact times, consider your system timezone.');\n console.log();\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createCronCommand(): Command {\n const cmd = new Command('cron')\n .description('Parse and explain cron expression')\n .argument('<expression>', 'Cron expression (e.g., \"0 5 * * *\")')\n .addHelpText('after', `\nExamples:\n $ jai1 utils cron \"0 5 * * *\"\n $ jai1 utils cron \"*/15 * * * *\"\n $ jai1 utils cron \"0 0 1 * *\"\n $ jai1 utils cron \"0 9-17 * * 1-5\"\n $ jai1 utils cron \"30 2 * * 0\"\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (expression) => {\n await handleCronParse(expression);\n });\n\n return cmd;\n}\n","/**\n * Markdown Preview Command\n * Preview markdown files in terminal\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { marked } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\n\nasync function handleMarkdownPreview(\n file: string,\n options: {\n raw: boolean;\n }\n): Promise<void> {\n try {\n let content = await readFile(file, 'utf-8');\n\n if (options.raw) {\n // Show raw markdown with basic formatting\n console.log('📄 Markdown File (Raw):');\n console.log('────────────────────────────────────────\\n');\n console.log(content);\n console.log();\n } else {\n // Pre-process content to replace Mermaid blocks with placeholders\n content = content.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n🎨 **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n💡 *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Render markdown in terminal\n marked.setOptions({\n // @ts-ignore - marked-terminal types may not match perfectly\n renderer: new TerminalRenderer(),\n });\n\n const rendered = marked(content);\n\n console.log('📄 Markdown Preview:');\n console.log('────────────────────────────────────────\\n');\n console.log(rendered);\n }\n } catch (error) {\n console.error('❌ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createMarkdownPreviewCommand(): Command {\n const cmd = new Command('markdown-preview')\n .description('Preview markdown file in terminal')\n .argument('<file>', 'Markdown file path')\n .option('--raw', 'Show raw markdown instead of rendered')\n .addHelpText('after', `\nExamples:\n $ jai1 utils markdown-preview README.md\n $ jai1 utils markdown-preview ./docs/guide.md\n $ jai1 utils markdown-preview CHANGELOG.md --raw\n $ jai1 utils markdown-preview ./notes.md\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (file, options) => {\n await handleMarkdownPreview(file, options);\n });\n\n return cmd;\n}\n","/**\n * Interactive Utils Mode\n * Launch the professional Ink-based TUI\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { UtilsApp } from '../../ui/utils/UtilsApp.js';\n\nexport async function runInteractiveMode(): Promise<void> {\n return new Promise((resolve) => {\n const { unmount, waitUntilExit } = render(\n React.createElement(UtilsApp, {\n onExit: () => {\n unmount();\n resolve();\n },\n })\n );\n\n // Wait for the app to exit\n waitUntilExit().then(() => {\n resolve();\n });\n });\n}\n","/**\n * Utils TUI App\n * Professional TUI interface with left sidebar menu\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { PasswordView } from './views/PasswordView.js';\nimport { UuidView } from './views/UuidView.js';\nimport { HashView } from './views/HashView.js';\nimport { Base64View } from './views/Base64View.js';\nimport { UrlView } from './views/UrlView.js';\nimport { UnixTimeView } from './views/UnixTimeView.js';\nimport { JwtView } from './views/JwtView.js';\nimport { CronView } from './views/CronView.js';\nimport { TimezoneView } from './views/TimezoneView.js';\nimport { HttpView } from './views/HttpView.js';\nimport { MarkdownView } from './views/MarkdownView.js';\n\nexport type UtilityType =\n | 'password'\n | 'uuid'\n | 'hash'\n | 'base64-encode'\n | 'base64-decode'\n | 'http'\n | 'jwt'\n | 'unix-time'\n | 'timezone'\n | 'url-encode'\n | 'url-decode'\n | 'cron'\n | 'markdown';\n\ninterface MenuItem {\n id: UtilityType;\n icon: string;\n label: string;\n description: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n { id: 'password', icon: '🔐', label: 'Password', description: 'Generate secure passwords' },\n { id: 'uuid', icon: '🆔', label: 'UUID', description: 'Generate UUID v4' },\n { id: 'hash', icon: '🔒', label: 'Hash', description: 'Hash with MD5/SHA/bcrypt' },\n { id: 'base64-encode', icon: '📝', label: 'Base64 Encode', description: 'Encode to Base64' },\n { id: 'base64-decode', icon: '📝', label: 'Base64 Decode', description: 'Decode Base64' },\n { id: 'http', icon: '🌐', label: 'HTTP Request', description: 'Make HTTP requests' },\n { id: 'jwt', icon: '🔑', label: 'JWT', description: 'Decode/encode JWT' },\n { id: 'unix-time', icon: '🕒', label: 'Unix Time', description: 'Convert timestamps' },\n { id: 'timezone', icon: '🌍', label: 'Timezone', description: 'Convert timezones' },\n { id: 'url-encode', icon: '🔗', label: 'URL Encode', description: 'Encode URLs' },\n { id: 'url-decode', icon: '🔗', label: 'URL Decode', description: 'Decode URLs' },\n { id: 'cron', icon: '⏰', label: 'Cron Parser', description: 'Parse cron expressions' },\n { id: 'markdown', icon: '📄', label: 'Markdown', description: 'Preview markdown' },\n];\n\ninterface UtilsAppProps {\n onExit: () => void;\n}\n\nexport const UtilsApp: React.FC<UtilsAppProps> = ({ onExit }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [activeView, setActiveView] = useState<UtilityType | null>(null);\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (activeView) {\n // If in a view, Escape goes back to menu\n if (key.escape) {\n setActiveView(null);\n }\n return;\n }\n\n // Main menu navigation\n if (key.upArrow || input === 'k') {\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : MENU_ITEMS.length - 1));\n } else if (key.downArrow || input === 'j') {\n setSelectedIndex((prev) => (prev < MENU_ITEMS.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n setActiveView(MENU_ITEMS[selectedIndex].id);\n } else if (input === 'q' || key.escape) {\n onExit();\n exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={2}\n paddingY={0}\n marginBottom={1}\n >\n <Text bold color=\"cyan\">\n 🛠️ Developer Utilities - Interactive Mode\n </Text>\n <Box marginLeft=\"auto\">\n <Text dimColor>Press 'q' to quit</Text>\n </Box>\n </Box>\n\n {/* Main Content Area */}\n <Box flexGrow={1}>\n {/* Left Sidebar - Menu */}\n <Box\n flexDirection=\"column\"\n width={30}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={1}\n marginRight={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"yellow\">\n Select Utility:\n </Text>\n </Box>\n\n {MENU_ITEMS.map((item, index) => (\n <Box key={item.id} marginBottom={0}>\n <Text\n color={selectedIndex === index && !activeView ? 'green' : undefined}\n bold={selectedIndex === index && !activeView}\n dimColor={activeView !== null && activeView !== item.id}\n >\n {selectedIndex === index && !activeView ? '▶ ' : ' '}\n {item.icon} {item.label}\n </Text>\n </Box>\n ))}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n ↑/↓: Navigate{'\\n'}\n Enter: Select{'\\n'}\n Esc: Back/Quit\n </Text>\n </Box>\n </Box>\n\n {/* Right Content Area */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n >\n {activeView ? (\n <ActiveUtilityView utilityType={activeView} />\n ) : (\n <WelcomeView selectedItem={MENU_ITEMS[selectedIndex]} />\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n marginTop={1}\n >\n <Text dimColor>\n jai1-cli | Use arrow keys or j/k to navigate\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Welcome view shown when no utility is selected\nconst WelcomeView: React.FC<{ selectedItem: MenuItem }> = ({ selectedItem }) => {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Welcome to Developer Utilities\n </Text>\n </Box>\n\n <Box marginBottom={2}>\n <Text>\n Select a utility from the left menu to get started.\n </Text>\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor=\"yellow\"\n paddingX={2}\n paddingY={1}\n marginBottom={2}\n >\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {selectedItem.icon} {selectedItem.label}\n </Text>\n <Text dimColor>{selectedItem.description}</Text>\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text bold>Quick Actions:</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>• Press <Text color=\"green\">Enter</Text> to open selected utility</Text>\n <Text>• Use <Text color=\"green\">↑/↓</Text> or <Text color=\"green\">j/k</Text> to navigate</Text>\n <Text>• Press <Text color=\"green\">Esc</Text> to go back or quit</Text>\n <Text>• Press <Text color=\"green\">q</Text> to quit anytime</Text>\n </Box>\n\n <Box marginTop={2}>\n <Text dimColor>\n 💡 Tip: Each utility provides an interactive interface for easy usage.\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Active utility view - renders the appropriate component\nconst ActiveUtilityView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n switch (utilityType) {\n case 'password':\n return <PasswordView />;\n case 'uuid':\n return <UuidView />;\n case 'hash':\n return <HashView />;\n case 'base64-encode':\n case 'base64-decode':\n return <Base64View />;\n case 'url-encode':\n case 'url-decode':\n return <UrlView />;\n case 'unix-time':\n return <UnixTimeView />;\n case 'jwt':\n return <JwtView />;\n case 'cron':\n return <CronView />;\n case 'timezone':\n return <TimezoneView />;\n case 'http':\n return <HttpView />;\n case 'markdown':\n return <MarkdownView />;\n default:\n return <PlaceholderView utilityType={utilityType} />;\n }\n};\n\n// Placeholder for utilities not yet implemented\nconst PlaceholderView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n const item = MENU_ITEMS.find((m) => m.id === utilityType);\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {item?.icon} {item?.label}\n </Text>\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"yellow\" paddingX={2} paddingY={1}>\n <Text>\n 🚧 This utility view is under construction.{'\\n'}\n {'\\n'}\n For now, use the command-line version:{'\\n'}\n <Text color=\"green\">$ jai1 utils {utilityType} --help</Text>\n {'\\n'}\n {'\\n'}\n Press <Text color=\"yellow\">Esc</Text> to return to the menu.\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Password Generator View\n * Interactive password generation with options\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const PasswordView: React.FC = () => {\n const [length, setLength] = useState('16');\n const [count, setCount] = useState('1');\n const [passwords, setPasswords] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'length' | 'count' | 'generate'>('length');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n // Cycle through fields\n if (focusedField === 'length') setFocusedField('count');\n else if (focusedField === 'count') setFocusedField('generate');\n else setFocusedField('length');\n } else if (key.return) {\n // Generate passwords on Enter from any field\n handleGenerate();\n } else if (input === 'c' && passwords.length > 0) {\n // Copy first password\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newPasswords: string[] = [];\n const lengthNum = parseInt(length, 10) || 16;\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newPasswords.push(\n service.generatePassword({\n length: lengthNum,\n lowercase: true,\n uppercase: true,\n digits: true,\n symbols: true,\n })\n );\n }\n setPasswords(newPasswords);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(passwords[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔐 Password Generator\n </Text>\n </Box>\n\n {/* Options */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n {/* Length Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'length' ? 'green' : undefined}>\n {focusedField === 'length' ? '▶ ' : ' '}Length:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'length' ? (\n <TextInput value={length} onChange={setLength} />\n ) : (\n <Text>{length}</Text>\n )}\n </Box>\n <Text dimColor>(characters)</Text>\n </Box>\n\n {/* Count Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? '▶ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n <Text dimColor>(passwords to generate)</Text>\n </Box>\n\n {/* Generate Button */}\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate Passwords ]\n </Text>\n </Box>\n </Box>\n\n {/* Results */}\n {passwords.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n ✓ Generated Passwords:\n </Text>\n\n {passwords.map((password, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{password}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> ✓ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next field | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * UUID Generator View\n * Interactive UUID generation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const UuidView: React.FC = () => {\n const [count, setCount] = useState('1');\n const [uppercase, setUppercase] = useState(false);\n const [noHyphens, setNoHyphens] = useState(false);\n const [uuids, setUuids] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'count' | 'uppercase' | 'hyphens' | 'generate'>('count');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['count', 'uppercase', 'hyphens', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'uppercase') {\n setUppercase(!uppercase);\n } else if (focusedField === 'hyphens') {\n setNoHyphens(!noHyphens);\n } else {\n // Generate on Enter from any field (except checkboxes)\n handleGenerate();\n }\n } else if (input === 'c' && uuids.length > 0) {\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newUuids: string[] = [];\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newUuids.push(service.generateUuid({ uppercase, noHyphens }));\n }\n setUuids(newUuids);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(uuids[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🆔 UUID Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? '▶ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'uppercase' ? 'green' : undefined}>\n {focusedField === 'uppercase' ? '▶ ' : ' '}\n [{uppercase ? '✓' : ' '}] Uppercase\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'hyphens' ? 'green' : undefined}>\n {focusedField === 'hyphens' ? '▶ ' : ' '}\n [{noHyphens ? '✓' : ' '}] No Hyphens\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate UUIDs ]\n </Text>\n </Box>\n </Box>\n\n {uuids.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n ✓ Generated UUIDs:\n </Text>\n\n {uuids.map((uuid, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{uuid}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> ✓ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Hash Generator View\n * Interactive hash generation with algorithm selection\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HashAlgorithm } from '../../../services/utils.service.js';\n\nconst ALGORITHMS: HashAlgorithm[] = ['sha256', 'sha512', 'sha1', 'md5', 'bcrypt'];\n\nexport const HashView: React.FC = () => {\n const [text, setText] = useState('hello world');\n const [algorithm, setAlgorithm] = useState<HashAlgorithm>('sha256');\n const [hash, setHash] = useState('');\n const [focusedField, setFocusedField] = useState<'text' | 'algorithm' | 'generate'>('text');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['text', 'algorithm', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Generate on Enter from any field\n handleGenerate();\n } else if (key.leftArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[currentIndex > 0 ? currentIndex - 1 : ALGORITHMS.length - 1]);\n } else if (key.rightArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[(currentIndex + 1) % ALGORITHMS.length]);\n } else if (input === 'c' && hash) {\n handleCopy();\n }\n });\n\n const handleGenerate = async () => {\n if (!text) return;\n\n let result: string;\n if (algorithm === 'bcrypt') {\n result = await service.hashBcrypt(text, 10);\n } else {\n result = await service.hash(text, algorithm);\n }\n setHash(result);\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(hash);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔒 Hash Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'text' ? 'green' : undefined}>\n {focusedField === 'text' ? '▶ ' : ' '}Text to hash:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'text' ? (\n <TextInput value={text} onChange={setText} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!text}>{text || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'algorithm' ? 'green' : undefined}>\n {focusedField === 'algorithm' ? '▶ ' : ' '}Algorithm:\n </Text>\n </Box>\n <Text bold color={focusedField === 'algorithm' ? 'yellow' : undefined}>\n {algorithm.toUpperCase()}\n </Text>\n {focusedField === 'algorithm' && (\n <Text dimColor> (← → to change)</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? '▶ ' : ' '}\n [ Generate Hash ]\n </Text>\n </Box>\n </Box>\n\n {hash && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Hash Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Algorithm: {algorithm.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{hash}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | ←/→: Change algorithm | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Base64 Encoder/Decoder View\n * Interactive Base64 encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const Base64View: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [urlSafe, setUrlSafe] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'urlsafe' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'urlsafe', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n setError('');\n } else if (focusedField === 'urlsafe') {\n setUrlSafe(!urlSafe);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) {\n setError('Input cannot be empty');\n return;\n }\n\n try {\n setError('');\n if (mode === 'encode') {\n const encoded = service.base64Encode(input, urlSafe);\n setResult(encoded);\n } else {\n const decoded = service.base64Decode(input);\n setResult(decoded.toString('utf-8'));\n }\n setCopied(false);\n } catch (err) {\n setError(`Failed to ${mode}: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📝 Base64 Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'encode' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'urlsafe' ? 'green' : undefined}>\n {focusedField === 'urlsafe' ? '▶ ' : ' '}\n [{urlSafe ? '✓' : ' '}] URL-Safe (+ → -, / → _)\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * URL Encoder/Decoder View\n * Interactive URL encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const UrlView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [fullUrl, setFullUrl] = useState(false);\n const [result, setResult] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'full' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'full', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n } else if (focusedField === 'full') {\n setFullUrl(!fullUrl);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) return;\n\n if (mode === 'encode') {\n const encoded = fullUrl\n ? service.urlEncode(input, true)\n : service.urlEncode(input, false);\n setResult(encoded);\n } else {\n const decoded = fullUrl\n ? service.urlDecode(input, true)\n : service.urlDecode(input, false);\n setResult(decoded);\n }\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔗 URL Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text or URL...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'full' ? 'green' : undefined}>\n {focusedField === 'full' ? '▶ ' : ' '}\n [{fullUrl ? '✓' : ' '}] Full URL (encode/decode entire URL)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()} {fullUrl ? '(Full URL)' : '(Component)'}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Unix Time Converter View\n * Interactive Unix timestamp conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'now' | 'to-human' | 'to-unix';\n\nexport const UnixTimeView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('now');\n const [format, setFormat] = useState<'iso' | 'local' | 'utc'>('iso');\n const [useMs, setUseMs] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'input' | 'format' | 'ms' | 'convert'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'now'\n ? ['mode', 'ms', 'convert']\n : mode === 'to-human'\n ? ['mode', 'input', 'format', 'convert']\n : ['mode', 'input', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n const modes: Mode[] = ['now', 'to-human', 'to-unix'];\n const currentIndex = modes.indexOf(mode);\n setMode(modes[(currentIndex + 1) % modes.length]);\n setResult('');\n setError('');\n } else if (focusedField === 'format') {\n const formats: typeof format[] = ['iso', 'local', 'utc'];\n const currentIndex = formats.indexOf(format);\n setFormat(formats[(currentIndex + 1) % formats.length]);\n } else if (focusedField === 'ms') {\n setUseMs(!useMs);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n try {\n setError('');\n if (mode === 'now') {\n const timestamp = service.unixTimeCurrent(useMs);\n setResult(timestamp.toString());\n } else if (mode === 'to-human') {\n if (!input) {\n setError('Please enter a timestamp');\n return;\n }\n const human = service.unixTimeToHuman(parseInt(input, 10), format);\n setResult(human);\n } else {\n if (!input) {\n setError('Please enter a date string');\n return;\n }\n const timestamp = service.unixTimeFromString(input);\n setResult(timestamp.toString());\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🕒 Unix Time Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'now' ? 'CURRENT TIME' : mode === 'to-human' ? 'TIMESTAMP → HUMAN' : 'HUMAN → TIMESTAMP'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n\n {mode !== 'now' && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? '▶ ' : ' '}\n {mode === 'to-human' ? 'Timestamp:' : 'Date string:'}\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'input' ? (\n <TextInput\n value={input}\n onChange={setInput}\n placeholder={mode === 'to-human' ? '1702550400' : '2024-01-15 10:30:00'}\n />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {mode === 'to-human' && (\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'format' ? 'green' : undefined}>\n {focusedField === 'format' ? '▶ ' : ' '}Format:\n </Text>\n </Box>\n <Text bold color={focusedField === 'format' ? 'yellow' : undefined}>\n {format.toUpperCase()}\n </Text>\n {focusedField === 'format' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n )}\n\n {mode === 'now' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'ms' ? 'green' : undefined}>\n {focusedField === 'ms' ? '▶ ' : ' '}\n [{useMs ? '✓' : ' '}] Milliseconds\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ {mode === 'now' ? 'Get Current' : 'Convert'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * JWT Decoder/Encoder View\n * Interactive JWT decoding and encoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'decode' | 'encode';\n\nexport const JwtView: React.FC = () => {\n const [mode, setMode] = useState<Mode>('decode');\n const [token, setToken] = useState('');\n const [payload, setPayload] = useState('');\n const [secret, setSecret] = useState('');\n const [result, setResult] = useState<{ header?: object; payload?: object; signature?: string; token?: string }>({});\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'token' | 'payload' | 'secret' | 'process'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'decode'\n ? ['mode', 'token', 'process']\n : ['mode', 'payload', 'secret', 'process'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'decode' ? 'encode' : 'decode');\n setResult({});\n setError('');\n } else {\n // Process on Enter from any input field or process button\n handleProcess();\n }\n } else if (input === 'c' && result.token) {\n handleCopy();\n }\n });\n\n const handleProcess = () => {\n try {\n setError('');\n if (mode === 'decode') {\n if (!token) {\n setError('Please enter a JWT token');\n return;\n }\n const decoded = service.jwtDecode(token);\n setResult(decoded);\n } else {\n if (!payload) {\n setError('Please enter payload JSON');\n return;\n }\n if (!secret) {\n setError('Please enter a secret key');\n return;\n }\n const payloadObj = JSON.parse(payload);\n const encoded = service.jwtEncode(payloadObj, secret);\n setResult({ token: encoded });\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Processing failed');\n setResult({});\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result.token || '');\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🔑 JWT Decoder/Encoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? '▶ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'decode' ? 'DECODE' : 'ENCODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'decode' ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'token' ? 'green' : undefined}>\n {focusedField === 'token' ? '▶ ' : ' '}JWT Token:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'token' ? (\n <TextInput\n value={token}\n onChange={setToken}\n placeholder=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n />\n ) : (\n <Text dimColor={!token}>{token || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n ) : (\n <>\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'payload' ? 'green' : undefined}>\n {focusedField === 'payload' ? '▶ ' : ' '}Payload (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'payload' ? (\n <TextInput\n value={payload}\n onChange={setPayload}\n placeholder='{\"sub\":\"123\",\"name\":\"John\"}'\n />\n ) : (\n <Text dimColor={!payload}>{payload || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'secret' ? 'green' : undefined}>\n {focusedField === 'secret' ? '▶ ' : ' '}Secret Key:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'secret' ? (\n <TextInput\n value={secret}\n onChange={setSecret}\n placeholder=\"your-secret-key\"\n mask=\"*\"\n />\n ) : (\n <Text dimColor={!secret}>\n {secret ? '*'.repeat(secret.length) : '(empty)'}\n </Text>\n )}\n </Box>\n </Box>\n </>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'process' ? 'green' : undefined}\n color={focusedField === 'process' ? 'black' : 'green'}\n >\n {focusedField === 'process' ? '▶ ' : ' '}\n [ {mode === 'decode' ? 'Decode' : 'Encode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {(result.header || result.token) && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && result.token && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n {result.header && (\n <>\n <Text bold color=\"yellow\">Header:</Text>\n <Text>{JSON.stringify(result.header, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Payload:</Text>\n <Text>{JSON.stringify(result.payload, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Signature:</Text>\n <Text dimColor>{result.signature}</Text>\n </>\n )}\n {result.token && (\n <>\n <Text bold color=\"yellow\">Token:</Text>\n <Text wrap=\"wrap\">{result.token}</Text>\n </>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/{mode === 'decode' ? 'Decode' : 'Encode'} | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Cron Parser View\n * Interactive cron expression parsing and explanation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const CronView: React.FC = () => {\n const [expression, setExpression] = useState('');\n const [result, setResult] = useState<{ description: string; nextRuns: string[] } | null>(null);\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'expression' | 'parse'>('expression');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'expression' ? 'parse' : 'expression');\n } else if (key.return) {\n // Parse on Enter from any field\n handleParse();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleParse = () => {\n if (!expression) {\n setError('Please enter a cron expression');\n return;\n }\n\n try {\n setError('');\n const parsed = service.parseCron(expression);\n setResult(parsed);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to parse cron expression');\n setResult(null);\n }\n };\n\n const handleCopy = async () => {\n if (!result) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = `${result.description}\\n\\nNext runs:\\n${result.nextRuns.join('\\n')}`;\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⏰ Cron Expression Parser\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'expression' ? 'green' : undefined}>\n {focusedField === 'expression' ? '▶ ' : ' '}Cron Expression:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'expression' ? (\n <TextInput\n value={expression}\n onChange={setExpression}\n placeholder=\"0 5 * * * (5-field or 6-field)\"\n />\n ) : (\n <Text dimColor={!expression}>{expression || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1} marginBottom={1}>\n <Text dimColor>\n Examples: \"0 5 * * *\" (daily at 5am), \"*/15 * * * *\" (every 15 min)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'parse' ? 'green' : undefined}\n color={focusedField === 'parse' ? 'black' : 'green'}\n >\n {focusedField === 'parse' ? '▶ ' : ' '}\n [ Parse Expression ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">Expression:</Text>\n <Text>{expression}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Meaning:</Text>\n <Text>{result.description}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Next 5 executions:</Text>\n {result.nextRuns.map((run, index) => (\n <Text key={index}> {index + 1}. {run}</Text>\n ))}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Parse | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Timezone Converter View\n * Interactive timezone conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const TimezoneView: React.FC = () => {\n const [time, setTime] = useState('');\n const [fromTz, setFromTz] = useState('UTC');\n const [toTz, setToTz] = useState('America/New_York');\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'time' | 'from' | 'to' | 'convert'>('time');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['time', 'from', 'to', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Convert on Enter from any field\n handleConvert();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!time) {\n setError('Please enter a time');\n return;\n }\n if (!fromTz || !toTz) {\n setError('Please enter both timezones');\n return;\n }\n\n try {\n setError('');\n const converted = service.convertTimezone(time, fromTz, toTz);\n setResult(converted);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🌍 Timezone Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'time' ? 'green' : undefined}>\n {focusedField === 'time' ? '▶ ' : ' '}Time:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'time' ? (\n <TextInput\n value={time}\n onChange={setTime}\n placeholder=\"2024-01-15 10:00:00\"\n />\n ) : (\n <Text dimColor={!time}>{time || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'from' ? 'green' : undefined}>\n {focusedField === 'from' ? '▶ ' : ' '}From Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'from' ? (\n <TextInput\n value={fromTz}\n onChange={setFromTz}\n placeholder=\"UTC or America/New_York\"\n />\n ) : (\n <Text dimColor={!fromTz}>{fromTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'to' ? 'green' : undefined}>\n {focusedField === 'to' ? '▶ ' : ' '}To Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'to' ? (\n <TextInput\n value={toTz}\n onChange={setToTz}\n placeholder=\"Asia/Tokyo or Europe/London\"\n />\n ) : (\n <Text dimColor={!toTz}>{toTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>\n Common: UTC, America/New_York, Europe/London, Asia/Tokyo\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? '▶ ' : ' '}\n [ Convert ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>From: {fromTz}</Text>\n <Text dimColor>To: {toTz}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * HTTP Request View\n * Interactive HTTP request tool\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HttpResponse } from '../../../services/utils.service.js';\n\nconst METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n\nexport const HttpView: React.FC = () => {\n const [url, setUrl] = useState('');\n const [method, setMethod] = useState<string>('GET');\n const [headers, setHeaders] = useState('');\n const [body, setBody] = useState('');\n const [response, setResponse] = useState<HttpResponse | null>(null);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [focusedField, setFocusedField] = useState<'url' | 'method' | 'headers' | 'body' | 'send'>('url');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (loading) return;\n\n if (key.tab) {\n const fields: typeof focusedField[] = ['url', 'method', 'headers', 'body', 'send'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.leftArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[currentIndex > 0 ? currentIndex - 1 : METHODS.length - 1]);\n } else if (key.rightArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[(currentIndex + 1) % METHODS.length]);\n } else if (key.return && focusedField === 'send') {\n handleSend();\n } else if (input === 'c' && response) {\n handleCopy();\n }\n });\n\n const handleSend = async () => {\n if (!url) {\n setError('Please enter a URL');\n return;\n }\n\n try {\n setError('');\n setLoading(true);\n\n const headersObj: Record<string, string> = {};\n if (headers) {\n const headerLines = headers.split('\\n');\n for (const line of headerLines) {\n const [key, ...valueParts] = line.split(':');\n if (key && valueParts.length > 0) {\n headersObj[key.trim()] = valueParts.join(':').trim();\n }\n }\n }\n\n const result = await service.httpRequest(url, {\n method,\n headers: headersObj,\n body: body || undefined,\n });\n\n setResponse(result);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Request failed');\n setResponse(null);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopy = async () => {\n if (!response) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = typeof response.body === 'string'\n ? response.body\n : JSON.stringify(response.body, null, 2);\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🌐 HTTP Request\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Request:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'url' ? 'green' : undefined}>\n {focusedField === 'url' ? '▶ ' : ' '}URL:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'url' ? (\n <TextInput\n value={url}\n onChange={setUrl}\n placeholder=\"https://api.example.com/endpoint\"\n />\n ) : (\n <Text dimColor={!url}>{url || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'method' ? 'green' : undefined}>\n {focusedField === 'method' ? '▶ ' : ' '}Method:\n </Text>\n </Box>\n <Text bold color={focusedField === 'method' ? 'yellow' : undefined}>\n {method}\n </Text>\n {focusedField === 'method' && (\n <Text dimColor> (← → to change)</Text>\n )}\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'headers' ? 'green' : undefined}>\n {focusedField === 'headers' ? '▶ ' : ' '}Headers (one per line, Key: Value):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'headers' ? (\n <TextInput\n value={headers}\n onChange={setHeaders}\n placeholder=\"Authorization: Bearer token\"\n />\n ) : (\n <Text dimColor={!headers}>{headers || '(none)'}</Text>\n )}\n </Box>\n </Box>\n\n {(method === 'POST' || method === 'PUT' || method === 'PATCH') && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'body' ? 'green' : undefined}>\n {focusedField === 'body' ? '▶ ' : ' '}Body (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'body' ? (\n <TextInput\n value={body}\n onChange={setBody}\n placeholder='{\"key\":\"value\"}'\n />\n ) : (\n <Text dimColor={!body}>{body || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'send' ? 'green' : undefined}\n color={focusedField === 'send' ? 'black' : 'green'}\n >\n {focusedField === 'send' ? '▶ ' : ' '}\n [ {loading ? 'Sending...' : 'Send Request'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {response && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Response:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">✓ Copied body to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>\n Status: <Text color={response.status < 400 ? 'green' : 'red'}>{response.status}</Text>\n </Text>\n <Text>Time: {response.time}ms</Text>\n <Text>Size: {response.size}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Headers:</Text>\n {Object.entries(response.headers).slice(0, 5).map(([key, value]) => (\n <Text key={key} dimColor> {key}: {value}</Text>\n ))}\n <Text> </Text>\n\n <Text bold color=\"yellow\">Body:</Text>\n <Text>\n {typeof response.body === 'string'\n ? response.body.slice(0, 500)\n : JSON.stringify(response.body, null, 2).slice(0, 500)}\n </Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | ←/→: Change method | Enter: Send | C: Copy body | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Markdown Preview View\n * Interactive markdown file preview\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport const MarkdownView: React.FC = () => {\n const [filePath, setFilePath] = useState('');\n const [content, setContent] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'file' | 'preview'>('file');\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'file' ? 'preview' : 'file');\n } else if (key.return) {\n // Preview on Enter from any field\n handlePreview();\n }\n });\n\n const handlePreview = async () => {\n if (!filePath) {\n setError('Please enter a file path');\n return;\n }\n\n try {\n setError('');\n\n const resolvedPath = path.resolve(filePath);\n if (!fs.existsSync(resolvedPath)) {\n setError(`File not found: ${resolvedPath}`);\n return;\n }\n\n let fileContent = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Pre-process Mermaid diagrams\n fileContent = fileContent.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n🎨 **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n💡 *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Import marked and marked-terminal dynamically\n const { marked } = await import('marked');\n const { default: markedTerminal } = await import('marked-terminal');\n\n // Configure marked with terminal renderer\n marked.use(markedTerminal() as any);\n\n // Render markdown\n const rendered = marked(fileContent) as string;\n setContent(rendered);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to preview file');\n setContent('');\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 📄 Markdown Preview\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'file' ? 'green' : undefined}>\n {focusedField === 'file' ? '▶ ' : ' '}File path:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'file' ? (\n <TextInput\n value={filePath}\n onChange={setFilePath}\n placeholder=\"./README.md or /path/to/file.md\"\n />\n ) : (\n <Text dimColor={!filePath}>{filePath || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'preview' ? 'green' : undefined}\n color={focusedField === 'preview' ? 'black' : 'green'}\n >\n {focusedField === 'preview' ? '▶ ' : ' '}\n [ Preview File ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">✗ Error: {error}</Text>\n </Box>\n )}\n\n {content && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n ✓ Preview:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>{content}</Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Preview | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Deps Command Group\n * Quản lý dependencies trong project\n */\nimport { Command } from 'commander';\nimport { createDepsUpgradeCommand } from './upgrade.js';\n\nexport function createDepsCommand(): Command {\n const depsCommand = new Command('deps')\n .description('Quản lý dependencies trong project');\n\n // Register subcommands\n depsCommand.addCommand(createDepsUpgradeCommand());\n\n return depsCommand;\n}\n","/**\n * Deps Upgrade Command\n * Upgrade npm packages trong package.json lên version mới nhất\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport { DepsService, PackageInfo } from '../../services/deps.service.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n gray: '\\x1b[90m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n};\n\ninterface UpgradeOptions {\n check?: boolean;\n all?: boolean;\n depsOnly?: boolean;\n devOnly?: boolean;\n}\n\nexport function createDepsUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade npm packages lên version mới nhất')\n .option('--check', 'Chỉ kiểm tra, không upgrade')\n .option('--all', 'Upgrade tất cả không cần chọn')\n .option('--deps-only', 'Chỉ upgrade dependencies')\n .option('--dev-only', 'Chỉ upgrade devDependencies')\n .action(async (options: UpgradeOptions) => {\n await handleDepsUpgrade(options);\n });\n}\n\nasync function handleDepsUpgrade(options: UpgradeOptions): Promise<void> {\n const depsService = new DepsService();\n const cwd = process.cwd();\n\n try {\n // 1. Đọc package.json\n console.log(`\\n${colors.cyan}🔍 Đang đọc package.json...${colors.reset}`);\n const pkg = await depsService.readPackageJson(cwd);\n\n // 2. Thu thập packages cần kiểm tra\n const packagesToCheck: Array<{ name: string; current: string; type: 'dep' | 'dev' }> = [];\n\n if (!options.devOnly && pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n // Bỏ qua các dependency không phải từ npm (git, file, link)\n if (isNpmVersion(version)) {\n packagesToCheck.push({ name, current: version, type: 'dep' });\n }\n }\n }\n\n if (!options.depsOnly && pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n if (isNpmVersion(version)) {\n packagesToCheck.push({ name, current: version, type: 'dev' });\n }\n }\n }\n\n if (packagesToCheck.length === 0) {\n console.log(`${colors.yellow}⚠️ Không tìm thấy packages để kiểm tra${colors.reset}\\n`);\n return;\n }\n\n const depsCount = packagesToCheck.filter(p => p.type === 'dep').length;\n const devCount = packagesToCheck.filter(p => p.type === 'dev').length;\n console.log(\n `${colors.bold}📦 Tìm thấy ${depsCount} dependencies và ${devCount} devDependencies${colors.reset}\\n`\n );\n\n // 3. Kiểm tra version mới nhất\n console.log(`${colors.cyan}⏳ Kiểm tra phiên bản mới nhất...${colors.reset}`);\n const upgradablePackages = await depsService.fetchBulkVersions(\n packagesToCheck,\n (completed, total) => {\n const progress = Math.round((completed / total) * 100);\n const bar = '█'.repeat(Math.floor(progress / 5)) + '░'.repeat(20 - Math.floor(progress / 5));\n process.stdout.write(`\\r[${bar}] ${completed}/${total} packages`);\n }\n );\n console.log('\\n'); // New line after progress\n\n // 4. Kiểm tra nếu không có packages cần upgrade\n if (upgradablePackages.length === 0) {\n console.log(`${colors.green}✅ Tất cả packages đã là phiên bản mới nhất!${colors.reset}\\n`);\n return;\n }\n\n // 5. Hiển thị bảng packages có thể upgrade\n displayUpgradeTable(upgradablePackages);\n\n // 6. Nếu --check, dừng tại đây\n if (options.check) {\n console.log(\n `${colors.cyan}💡 Chạy \"jai1 deps upgrade\" để tiến hành upgrade.${colors.reset}\\n`\n );\n return;\n }\n\n // 7. Chọn packages để upgrade\n let selectedPackages: PackageInfo[];\n\n if (options.all) {\n selectedPackages = upgradablePackages;\n console.log(`${colors.cyan}📋 Đã chọn tất cả ${selectedPackages.length} packages${colors.reset}\\n`);\n } else {\n try {\n const selected = await checkbox({\n message: 'Chọn packages để upgrade (ESC để hủy):',\n choices: upgradablePackages.map(pkg => ({\n name: `${pkg.name} (${pkg.current} → ${pkg.latestWithPrefix}) [${pkg.type}]`,\n value: pkg.name,\n checked: true, // Mặc định chọn tất cả\n })),\n instructions: '↑↓ navigate • space select • a all • i invert • ⏎ submit • esc cancel',\n });\n\n if (selected.length === 0) {\n console.log(`${colors.yellow}⏸️ Không có packages nào được chọn${colors.reset}\\n`);\n return;\n }\n\n selectedPackages = upgradablePackages.filter(pkg => selected.includes(pkg.name));\n } catch {\n // User pressed ESC or Ctrl+C\n console.log(`\\n${colors.yellow}⏸️ Đã hủy${colors.reset}\\n`);\n return;\n }\n }\n\n // 8. Xác nhận upgrade\n let shouldProceed: boolean;\n try {\n shouldProceed = await confirm({\n message: `Tiến hành upgrade ${selectedPackages.length} packages?`,\n default: true,\n });\n } catch {\n // User pressed ESC or Ctrl+C\n console.log(`\\n${colors.yellow}⏸️ Đã hủy${colors.reset}\\n`);\n return;\n }\n\n if (!shouldProceed) {\n console.log(`${colors.yellow}⏸️ Upgrade đã hủy${colors.reset}\\n`);\n return;\n }\n\n // 9. Detect package manager và thực hiện upgrade\n const pm = await depsService.detectPackageManager(cwd);\n console.log(`\\n${colors.cyan}🔧 Package manager: ${pm}${colors.reset}`);\n console.log(`${colors.cyan}📥 Đang upgrade...${colors.reset}\\n`);\n\n const commands = depsService.getUpgradeCommands(selectedPackages, pm);\n\n try {\n if (commands.deps) {\n console.log(`${colors.dim}$ ${commands.deps}${colors.reset}\\n`);\n depsService.executeUpgrade(commands.deps);\n }\n if (commands.devDeps) {\n console.log(`\\n${colors.dim}$ ${commands.devDeps}${colors.reset}\\n`);\n depsService.executeUpgrade(commands.devDeps);\n }\n\n console.log(\n `\\n${colors.green}✅ Đã upgrade ${selectedPackages.length} packages thành công!${colors.reset}\\n`\n );\n } catch (error) {\n console.error(`\\n${colors.red}❌ Lỗi khi upgrade:${colors.reset}`);\n console.error(`${colors.red}${(error as Error).message}${colors.reset}\\n`);\n\n console.log(`${colors.yellow}💡 Bạn có thể thử upgrade thủ công:${colors.reset}`);\n if (commands.deps) console.log(` ${colors.cyan}${commands.deps}${colors.reset}`);\n if (commands.devDeps) console.log(` ${colors.cyan}${commands.devDeps}${colors.reset}`);\n console.log('');\n\n process.exit(1);\n }\n } catch (error) {\n console.error(`\\n${colors.red}❌ ${(error as Error).message}${colors.reset}\\n`);\n process.exit(1);\n }\n}\n\n/**\n * Kiểm tra version có phải từ npm không (loại bỏ git, file, link, workspace)\n */\nfunction isNpmVersion(version: string): boolean {\n // Bỏ qua các loại dependency đặc biệt\n if (\n version.startsWith('git') ||\n version.startsWith('github') ||\n version.startsWith('file:') ||\n version.startsWith('link:') ||\n version.startsWith('workspace:') ||\n version.includes('://')\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Hiển thị bảng packages có thể upgrade\n */\nfunction displayUpgradeTable(packages: PackageInfo[]): void {\n console.log(`${colors.bold}📊 Có thể upgrade:${colors.reset}\\n`);\n\n // Tính độ rộng các cột\n const nameWidth = Math.max(7, ...packages.map(p => p.name.length));\n const currentWidth = Math.max(8, ...packages.map(p => p.current.length));\n const latestWidth = Math.max(8, ...packages.map(p => p.latestWithPrefix.length));\n\n // Header\n const header = `│ ${'Package'.padEnd(nameWidth)} │ ${'Hiện tại'.padEnd(currentWidth)} │ ${'Mới nhất'.padEnd(latestWidth)} │ Loại │`;\n const separator = `├${'─'.repeat(nameWidth + 2)}┼${'─'.repeat(currentWidth + 2)}┼${'─'.repeat(latestWidth + 2)}┼──────┤`;\n const topBorder = `┌${'─'.repeat(nameWidth + 2)}┬${'─'.repeat(currentWidth + 2)}┬${'─'.repeat(latestWidth + 2)}┬──────┐`;\n const bottomBorder = `└${'─'.repeat(nameWidth + 2)}┴${'─'.repeat(currentWidth + 2)}┴${'─'.repeat(latestWidth + 2)}┴──────┘`;\n\n console.log(topBorder);\n console.log(header);\n console.log(separator);\n\n for (const pkg of packages) {\n const typeLabel = pkg.type === 'dep' ? 'dep ' : 'dev ';\n const typeColor = pkg.type === 'dep' ? colors.cyan : colors.yellow;\n console.log(\n `│ ${pkg.name.padEnd(nameWidth)} │ ${colors.gray}${pkg.current.padEnd(currentWidth)}${colors.reset} │ ${colors.green}${pkg.latestWithPrefix.padEnd(latestWidth)}${colors.reset} │ ${typeColor}${typeLabel}${colors.reset}│`\n );\n }\n\n console.log(bottomBorder);\n console.log('');\n}\n","/**\n * Dependencies Service\n * Quản lý kiểm tra và upgrade npm packages\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport pLimit from 'p-limit';\n\nexport interface PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport interface PackageInfo {\n name: string;\n current: string;\n latest: string;\n latestWithPrefix: string;\n type: 'dep' | 'dev';\n canUpgrade: boolean;\n}\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport class DepsService {\n private versionCache: Map<string, string> = new Map();\n\n /**\n * Đọc package.json từ thư mục\n */\n async readPackageJson(cwd: string): Promise<PackageJson> {\n const pkgPath = path.join(cwd, 'package.json');\n\n try {\n const content = await fs.readFile(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error('Không tìm thấy package.json trong thư mục hiện tại');\n }\n throw new Error(`Lỗi đọc package.json: ${(error as Error).message}`);\n }\n }\n\n /**\n * Lấy version mới nhất từ npm registry\n */\n async fetchLatestVersion(packageName: string): Promise<string | null> {\n // Check cache\n if (this.versionCache.has(packageName)) {\n return this.versionCache.get(packageName)!;\n }\n\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n { signal: AbortSignal.timeout(10000) }\n );\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { version: string };\n this.versionCache.set(packageName, data.version);\n return data.version;\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch nhiều packages cùng lúc với giới hạn concurrent\n */\n async fetchBulkVersions(\n packages: Array<{ name: string; current: string; type: 'dep' | 'dev' }>,\n onProgress?: (completed: number, total: number) => void\n ): Promise<PackageInfo[]> {\n const limit = pLimit(10); // 10 concurrent requests\n const total = packages.length;\n let completed = 0;\n\n const results = await Promise.all(\n packages.map(pkg =>\n limit(async () => {\n const latest = await this.fetchLatestVersion(pkg.name);\n completed++;\n onProgress?.(completed, total);\n\n if (!latest) {\n return null;\n }\n\n const currentClean = this.stripSemverPrefix(pkg.current);\n const canUpgrade = this.isNewerVersion(latest, currentClean);\n\n return {\n name: pkg.name,\n current: pkg.current,\n latest,\n latestWithPrefix: this.preserveSemverPrefix(pkg.current, latest),\n type: pkg.type,\n canUpgrade,\n } satisfies PackageInfo;\n })\n )\n );\n\n return results.filter((r): r is PackageInfo => r !== null && r.canUpgrade);\n }\n\n /**\n * Loại bỏ semver prefix (^, ~, >=, etc.)\n */\n stripSemverPrefix(version: string): string {\n return version.replace(/^[~^>=<]+/, '');\n }\n\n /**\n * Giữ nguyên semver prefix khi upgrade\n */\n preserveSemverPrefix(current: string, latest: string): string {\n const match = current.match(/^([~^>=<]*)/);\n const prefix = match?.[1] || '';\n return prefix + latest;\n }\n\n /**\n * So sánh version để xác định có cần upgrade không\n */\n isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n }\n\n /**\n * Detect package manager từ lock files\n * Priority:\n * 1. Lock file trong project\n * 2. pnpm nếu có cài đặt trong máy\n * 3. npm (fallback)\n */\n async detectPackageManager(cwd: string): Promise<PackageManager> {\n // 1. Check lock files trong project\n const lockFiles: Array<{ file: string; pm: PackageManager }> = [\n { file: 'pnpm-lock.yaml', pm: 'pnpm' },\n { file: 'yarn.lock', pm: 'yarn' },\n { file: 'bun.lockb', pm: 'bun' },\n { file: 'package-lock.json', pm: 'npm' },\n ];\n\n for (const { file, pm } of lockFiles) {\n try {\n await fs.access(path.join(cwd, file));\n return pm;\n } catch {\n // File không tồn tại, tiếp tục kiểm tra\n }\n }\n\n // 2. Check npm_config_user_agent (khi chạy qua npm scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Ưu tiên pnpm nếu có cài đặt trong máy\n if (this.isCommandAvailable('pnpm')) return 'pnpm';\n\n // 4. Fallback to npm\n return 'npm';\n }\n\n /**\n * Kiểm tra command có sẵn trong hệ thống không\n */\n private isCommandAvailable(command: string): boolean {\n try {\n execSync(`${command} --version`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Tạo command để upgrade packages\n */\n getUpgradeCommands(\n packages: PackageInfo[],\n pm: PackageManager\n ): { deps: string | null; devDeps: string | null } {\n const deps = packages.filter(p => p.type === 'dep');\n const devDeps = packages.filter(p => p.type === 'dev');\n\n const formatPackages = (pkgs: PackageInfo[]) =>\n pkgs.map(p => `${p.name}@${p.latestWithPrefix}`).join(' ');\n\n let depsCmd: string | null = null;\n let devDepsCmd: string | null = null;\n\n if (deps.length > 0) {\n const pkgList = formatPackages(deps);\n switch (pm) {\n case 'pnpm':\n depsCmd = `pnpm add ${pkgList}`;\n break;\n case 'yarn':\n depsCmd = `yarn add ${pkgList}`;\n break;\n case 'bun':\n depsCmd = `bun add ${pkgList}`;\n break;\n default:\n depsCmd = `npm install ${pkgList}`;\n }\n }\n\n if (devDeps.length > 0) {\n const pkgList = formatPackages(devDeps);\n switch (pm) {\n case 'pnpm':\n devDepsCmd = `pnpm add -D ${pkgList}`;\n break;\n case 'yarn':\n devDepsCmd = `yarn add -D ${pkgList}`;\n break;\n case 'bun':\n devDepsCmd = `bun add -D ${pkgList}`;\n break;\n default:\n devDepsCmd = `npm install -D ${pkgList}`;\n }\n }\n\n return { deps: depsCmd, devDeps: devDepsCmd };\n }\n\n /**\n * Thực thi upgrade command\n */\n executeUpgrade(command: string): void {\n execSync(command, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' },\n });\n }\n}\n","import { Command } from 'commander';\nimport { createKitListCommand } from './list.js';\nimport { createKitInfoCommand } from './info.js';\nimport { createKitCreateCommand } from './create.js';\n\nexport function createKitCommand(): Command {\n const cmd = new Command('kit')\n .description('Manage starter kits for new projects')\n .action(() => {\n // Default: show help\n cmd.help();\n });\n\n cmd.addCommand(createKitListCommand());\n cmd.addCommand(createKitInfoCommand());\n cmd.addCommand(createKitCreateCommand());\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitListCommand(): Command {\n return new Command('list')\n .description('List available starter kits')\n .option('-c, --category <category>', 'Filter by category (backend, frontend, fullstack)')\n .option('-s, --search <term>', 'Search kits by name or description')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const kitService = new StarterKitService();\n const kits = await kitService.list(config, {\n category: options.category,\n search: options.search,\n });\n\n if (kits.length === 0) {\n console.log('No starter kits found.');\n return;\n }\n\n // Group by category\n const byCategory: Record<string, typeof kits> = {};\n for (const kit of kits) {\n if (!byCategory[kit.category]) {\n byCategory[kit.category] = [];\n }\n byCategory[kit.category].push(kit);\n }\n\n console.log('📦 Available Starter Kits:\\n');\n\n for (const [category, categoryKits] of Object.entries(byCategory)) {\n console.log(`${category.charAt(0).toUpperCase() + category.slice(1)}:`);\n for (const kit of categoryKits) {\n const tags = kit.tags.length > 0 ? ` [${kit.tags.join(', ')}]` : '';\n console.log(\n ` ${kit.slug.padEnd(20)} ${kit.description.slice(0, 50).padEnd(52)} v${kit.version}${tags}`\n );\n }\n console.log();\n }\n });\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport AdmZip from 'adm-zip';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\nexport interface StarterKit {\n id: number;\n slug: string;\n name: string;\n description: string;\n category: string;\n tags: string[];\n version: string;\n downloads: number;\n}\n\nexport interface StarterKitFull extends StarterKit {\n config: KitConfig;\n}\n\nexport interface KitConfig {\n slug: string;\n name: string;\n description: string;\n category: string;\n tags?: string[];\n version: string;\n requiredTools?: string[];\n variables?: Variable[];\n hooks?: {\n preInit?: string[];\n postExtract?: string[];\n postInit?: string[];\n };\n framework?: {\n apply: boolean;\n components: string[];\n };\n ide?: {\n promptSync?: boolean;\n defaultTargets?: string[];\n };\n git?: {\n init: boolean;\n initialCommit?: string;\n };\n}\n\nexport interface Variable {\n name: string;\n prompt: string;\n type?: 'text' | 'select';\n default?: string;\n options?: string[];\n validate?: string;\n}\n\n/**\n * Service for managing starter kits\n */\nexport class StarterKitService {\n /**\n * List available starter kits\n */\n async list(\n config: Jai1Config,\n options?: { category?: string; search?: string }\n ): Promise<StarterKit[]> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/starter-kits${params.toString() ? '?' + params : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list starter kits: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { kits: StarterKit[] };\n return data.kits;\n }\n\n /**\n * Get single starter kit with full config\n */\n async get(config: Jai1Config, slug: string): Promise<StarterKitFull> {\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Starter kit not found: ${slug}`);\n }\n throw new NetworkError(`Failed to get starter kit: HTTP ${response.status}`);\n }\n\n return (await response.json()) as StarterKitFull;\n }\n\n /**\n * Download and extract starter kit\n */\n async downloadAndExtract(\n config: Jai1Config,\n slug: string,\n targetDir: string,\n onProgress?: (percent: number) => void\n ): Promise<void> {\n if (onProgress) onProgress(10);\n\n // Download zip directly from API (streams from R2)\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}/download`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to download kit: HTTP ${response.status}`);\n }\n\n if (onProgress) onProgress(30);\n\n // Save to temp file\n const tmpDir = join(process.env.TMPDIR || '/tmp', 'jai1-kits');\n await fs.mkdir(tmpDir, { recursive: true });\n const tmpFile = join(tmpDir, `${slug}.zip`);\n\n const buffer = await response.arrayBuffer();\n await fs.writeFile(tmpFile, Buffer.from(buffer));\n\n if (onProgress) onProgress(60);\n\n // Extract\n const zip = new AdmZip(tmpFile);\n await fs.mkdir(targetDir, { recursive: true });\n zip.extractAllTo(targetDir, true);\n\n if (onProgress) onProgress(100);\n\n // Cleanup\n await fs.unlink(tmpFile);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitInfoCommand(): Command {\n return new Command('info')\n .description('Show detailed information about a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .action(async (slug) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const kitService = new StarterKitService();\n const kit = await kitService.get(config, slug);\n\n console.log(`📦 ${kit.name}\\n`);\n console.log(`Description: ${kit.description}`);\n console.log(`Category: ${kit.category}`);\n console.log(`Version: ${kit.version}`);\n console.log(`Downloads: ${kit.downloads}`);\n\n if (kit.tags.length > 0) {\n console.log(`Tags: ${kit.tags.join(', ')}`);\n }\n\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log(`\\nRequired Tools:`);\n kit.config.requiredTools.forEach((tool) => {\n console.log(` - ${tool}`);\n });\n }\n\n if (kit.config.framework?.apply && kit.config.framework.components.length > 0) {\n console.log(`\\nIncluded Framework Components:`);\n kit.config.framework.components.forEach((comp) => {\n console.log(` - ${comp}`);\n });\n }\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n console.log(`\\nVariables (prompted during creation):`);\n kit.config.variables.forEach((v) => {\n console.log(` - ${v.name}: ${v.prompt}${v.default ? ` (default: ${v.default})` : ''}`);\n });\n }\n\n if (kit.config.hooks?.postInit && kit.config.hooks.postInit.length > 0) {\n console.log(`\\nPost-Init Commands:`);\n kit.config.hooks.postInit.forEach((cmd) => {\n console.log(` - ${cmd}`);\n });\n }\n });\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, input, checkbox } from '@inquirer/prompts';\nimport { execa } from 'execa';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { HookExecutor } from '../../services/hook-executor.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitCreateCommand(): Command {\n return new Command('create')\n .description('Create a new project from a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .argument('[directory]', 'Project directory (default: ./<slug>)')\n .option('-y, --yes', 'Auto mode - use defaults, no prompts')\n .option('--name <name>', 'Project name')\n .option('--skip-install', 'Skip dependency installation')\n .option('--skip-git', 'Skip git initialization')\n .option('--skip-framework', 'Skip framework apply')\n .option('--skip-ide', 'Skip IDE sync')\n .action(async (slug, directory, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const isAutoMode = options.yes === true;\n const kitService = new StarterKitService();\n\n // Step 1: Fetch metadata\n console.log(`📦 Fetching starter kit: ${slug}...`);\n const kit = await kitService.get(config, slug);\n\n // Step 2: Check required tools\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log('🔍 Checking required tools...');\n for (const tool of kit.config.requiredTools) {\n try {\n await execa('which', [tool]);\n } catch {\n console.warn(`⚠️ Warning: Required tool '${tool}' not found`);\n }\n }\n }\n\n // Determine target directory\n const targetDir = directory || join(process.cwd(), options.name || slug);\n\n // Check if directory exists\n try {\n await fs.access(targetDir);\n throw new Error(`Directory already exists: ${targetDir}`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n // Step 3: Run preInit hooks\n if (kit.config.hooks?.preInit && kit.config.hooks.preInit.length > 0) {\n console.log('🔧 Running pre-init hooks...');\n const hookExecutor = new HookExecutor(process.cwd(), {});\n await hookExecutor.run(kit.config.hooks.preInit);\n }\n\n // Step 4: Download and extract\n console.log('📥 Downloading template...');\n await kitService.downloadAndExtract(config, slug, targetDir, (percent) => {\n if (percent === 100) {\n console.log(' ✓ Downloaded and extracted');\n }\n });\n\n // Step 5: Run postExtract hooks\n if (kit.config.hooks?.postExtract && kit.config.hooks.postExtract.length > 0) {\n console.log('📄 Setting up environment...');\n const hookExecutor = new HookExecutor(targetDir, {});\n await hookExecutor.run(kit.config.hooks.postExtract);\n }\n\n // Step 6: Prompt variables or use defaults\n const variables: Record<string, string> = {};\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n if (isAutoMode) {\n console.log('📝 Using default values (auto mode)');\n for (const v of kit.config.variables) {\n variables[v.name] =\n options.name && v.name === 'PROJECT_NAME'\n ? options.name\n : v.default || '';\n }\n } else {\n console.log('📝 Please provide project details:');\n for (const v of kit.config.variables) {\n if (v.type === 'select' && v.options) {\n const answer = await select({\n message: v.prompt,\n choices: v.options.map((opt) => ({ name: opt, value: opt })),\n default: v.default,\n });\n variables[v.name] = answer as string;\n } else {\n const answer = await input({\n message: v.prompt,\n default: v.default,\n });\n variables[v.name] = answer;\n }\n }\n }\n }\n\n // Step 7: Apply variable substitution\n if (Object.keys(variables).length > 0) {\n await applyVariableSubstitution(targetDir, variables);\n }\n\n // Step 8: Apply framework components\n if (!options.skipFramework && kit.config.framework?.apply) {\n console.log('🤖 Applying jai1 framework...');\n const componentsService = new ComponentsService(targetDir);\n\n for (const filepath of kit.config.framework.components) {\n console.log(` 📥 Installing ${filepath}...`);\n await componentsService.install(config, filepath);\n }\n\n console.log(' ✓ Framework components applied');\n }\n\n // Step 9: Git init\n if (!options.skipGit && kit.config.git?.init) {\n console.log('🔧 Initializing git repository...');\n await execa('git', ['init'], { cwd: targetDir });\n await execa('git', ['add', '.'], { cwd: targetDir });\n const commitMsg = kit.config.git.initialCommit || 'Initial commit';\n await execa('git', ['commit', '-m', commitMsg], { cwd: targetDir });\n console.log(' ✓ Git initialized');\n }\n\n // Step 10: Run postInit hooks\n if (!options.skipInstall && kit.config.hooks?.postInit) {\n console.log('🔧 Running setup...');\n const hookExecutor = new HookExecutor(targetDir, variables);\n await hookExecutor.run(kit.config.hooks.postInit);\n }\n\n // Step 11: IDE sync\n const shouldPromptIdeSync = kit.config.ide?.promptSync !== false;\n if (!options.skipIde && shouldPromptIdeSync) {\n const ideChoices = [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Windsurf', value: 'windsurf' },\n { name: 'Claude Code', value: 'claude-code' },\n { name: 'Antigravity', value: 'antigravity' },\n ];\n\n let selectedIdes: string[] = [];\n\n if (isAutoMode) {\n selectedIdes = kit.config.ide?.defaultTargets || [];\n if (selectedIdes.length > 0) {\n console.log(`🖥️ Syncing to IDEs: ${selectedIdes.join(', ')}`);\n }\n } else {\n const defaultTargets = kit.config.ide?.defaultTargets || [];\n const answer = await checkbox({\n message: 'Chọn IDE để sync framework:',\n choices: ideChoices.map((c) => ({\n ...c,\n checked: defaultTargets.includes(c.value),\n })),\n });\n selectedIdes = answer as string[];\n }\n\n if (selectedIdes.length > 0) {\n await execa('jai1', ['ide', 'sync', ...selectedIdes], {\n cwd: targetDir,\n stdio: 'inherit',\n });\n }\n }\n\n // Done\n console.log('\\n✅ Project created successfully!');\n console.log(`📁 Location: ${targetDir}`);\n console.log('\\n💡 Next steps:');\n console.log(` cd ${targetDir}`);\n console.log(' jai1 apply # Install framework components');\n console.log(' jai1 ide sync <ides> # Sync to your IDE(s)');\n });\n}\n\n/**\n * Apply variable substitution to files\n */\nasync function applyVariableSubstitution(\n dir: string,\n variables: Record<string, string>\n): Promise<void> {\n const files = await getAllFiles(dir);\n\n for (const file of files) {\n let content = await fs.readFile(file, 'utf-8');\n let modified = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n if (regex.test(content)) {\n content = content.replace(regex, value);\n modified = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(file, content, 'utf-8');\n }\n }\n}\n\n/**\n * Get all files recursively\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n files.push(...(await getAllFiles(fullPath)));\n }\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import { execa } from 'execa';\n\n/**\n * Service for executing kit hooks\n */\nexport class HookExecutor {\n constructor(\n private cwd: string,\n private variables: Record<string, string>\n ) {}\n\n /**\n * Run hooks sequentially\n */\n async run(hooks: string[]): Promise<void> {\n for (const hook of hooks) {\n const cmd = this.replaceVariables(hook);\n console.log(` $ ${cmd}`);\n\n try {\n await execa(cmd, {\n cwd: this.cwd,\n shell: true,\n stdio: 'inherit',\n });\n } catch (error) {\n throw new Error(`Hook failed: ${cmd}`);\n }\n }\n }\n\n /**\n * Replace variables in command\n */\n private replaceVariables(cmd: string): string {\n let result = cmd;\n for (const [key, value] of Object.entries(this.variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { createRulesListCommand } from './list.js';\nimport { createRulesInitCommand } from './init.js';\nimport { createRulesSyncCommand } from './sync.js';\nimport { createRulesInfoCommand } from './info.js';\n\nexport function createRulesCommand(): Command {\n const rulesCommand = new Command('rules')\n .description('Manage rule presets for AI agents');\n\n // Add subcommands\n rulesCommand.addCommand(createRulesListCommand());\n rulesCommand.addCommand(createRulesInitCommand());\n rulesCommand.addCommand(createRulesSyncCommand());\n rulesCommand.addCommand(createRulesInfoCommand());\n\n return rulesCommand;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface Preset {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: {\n frontend?: string | null;\n backend?: string | null;\n css?: string | null;\n database?: string | null;\n language?: string | null;\n };\n downloads: number;\n}\n\ninterface ListPresetsResponse {\n presets: Preset[];\n total: number;\n}\n\nexport function createRulesListCommand(): Command {\n return new Command('list')\n .description('List available rule presets')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n console.log('📋 Fetching available rule presets...\\n');\n\n try {\n const response = await fetch(`${config.apiUrl}/api/rules/presets`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch presets: ${response.statusText}`);\n }\n\n const data = (await response.json()) as ListPresetsResponse;\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.total === 0) {\n console.log('No presets available.');\n return;\n }\n\n console.log(`Found ${data.total} preset${data.total > 1 ? 's' : ''}:\\n`);\n\n for (const preset of data.presets) {\n console.log(`📦 ${preset.slug}`);\n console.log(` Name: ${preset.name}`);\n console.log(` Description: ${preset.description}`);\n console.log(` Version: ${preset.version}`);\n\n // Stack info\n const stackParts: string[] = [];\n if (preset.stack.frontend) stackParts.push(preset.stack.frontend);\n if (preset.stack.backend) stackParts.push(preset.stack.backend);\n if (preset.stack.css) stackParts.push(preset.stack.css);\n if (preset.stack.database) stackParts.push(preset.stack.database);\n if (stackParts.length > 0) {\n console.log(` Stack: ${stackParts.join(' + ')}`);\n }\n\n console.log(` Tags: ${preset.tags.join(', ')}`);\n console.log(` Downloads: ${preset.downloads}`);\n console.log('');\n }\n\n console.log(`\\nℹ️ Use 'jai1 rules init --preset=<slug>' to apply a preset`);\n } catch (error) {\n throw new Error(\n `Failed to list presets: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n });\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface Preset {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: {\n frontend?: string | null;\n backend?: string | null;\n css?: string | null;\n database?: string | null;\n language?: string | null;\n };\n downloads: number;\n}\n\ninterface PresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\ninterface ProjectRulesConfig {\n preset: string;\n version: string;\n appliedAt: string;\n customContext: string;\n}\n\nexport function createRulesInitCommand(): Command {\n return new Command('init')\n .description('Apply rule preset to project')\n .option('--preset <slug>', 'Preset slug to apply')\n .option('--output <format>', 'Output format: cursor, agents-md, both (default: cursor)', 'cursor')\n .option('-y, --yes', 'Skip confirmations')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n let presetSlug = options.preset as string | undefined;\n\n // If no preset specified, show interactive selection\n if (!presetSlug) {\n console.log('📋 Fetching available presets...\\n');\n\n const response = await fetch(`${config.apiUrl}/api/rules/presets`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch presets: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { presets: Preset[]; total: number };\n\n if (data.total === 0) {\n console.log('No presets available.');\n return;\n }\n\n presetSlug = await select({\n message: 'Select a preset:',\n choices: data.presets.map((p) => ({\n name: `${p.name} - ${p.description}`,\n value: p.slug,\n description: `v${p.version} | ${p.tags.join(', ')}`,\n })),\n });\n }\n\n // Fetch preset bundle\n console.log(`\\n📦 Fetching preset: ${presetSlug}...\\n`);\n\n const presetResponse = await fetch(`${config.apiUrl}/api/rules/presets/${presetSlug}`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!presetResponse.ok) {\n if (presetResponse.status === 404) {\n throw new Error(`Preset '${presetSlug}' not found`);\n }\n throw new Error(`Failed to fetch preset: ${presetResponse.statusText}`);\n }\n\n const bundle = (await presetResponse.json()) as PresetBundle;\n\n console.log(`✓ Preset: ${bundle.preset.name} v${bundle.preset.version}`);\n console.log(` Files: ${Object.keys(bundle.files).length}`);\n\n // Determine output format\n let outputFormat = options.output as string;\n if (!['cursor', 'agents-md', 'both'].includes(outputFormat)) {\n outputFormat = await select({\n message: 'Select output format:',\n choices: [\n { name: 'Cursor (.cursor/rules/)', value: 'cursor' },\n { name: 'AGENTS.md (single file)', value: 'agents-md' },\n { name: 'Both', value: 'both' },\n ],\n });\n }\n\n // Confirm before applying\n if (!options.yes) {\n const proceed = await confirm({\n message: `Apply preset '${bundle.preset.name}' to current directory?`,\n default: true,\n });\n\n if (!proceed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n console.log('\\n📝 Applying preset...\\n');\n\n // Apply based on output format\n if (outputFormat === 'cursor' || outputFormat === 'both') {\n await applyCursorFormat(bundle);\n }\n\n if (outputFormat === 'agents-md' || outputFormat === 'both') {\n await applyAgentsMdFormat(bundle);\n }\n\n // Create project config\n const projectConfig: ProjectRulesConfig = {\n preset: bundle.preset.slug,\n version: bundle.preset.version,\n appliedAt: new Date().toISOString(),\n customContext: '09-custom.mdc',\n };\n\n await fs.writeFile('jai1-rules.json', JSON.stringify(projectConfig, null, 2));\n console.log('✓ Created jai1-rules.json');\n\n console.log('\\n✅ Preset applied successfully!\\n');\n console.log('Next steps:');\n console.log(' 1. Edit 09-custom.mdc to add project-specific rules');\n console.log(' 2. Commit the rules to git');\n console.log(' 3. Use \"jai1 rules sync\" to regenerate outputs after editing\\n');\n });\n}\n\nasync function applyCursorFormat(bundle: PresetBundle): Promise<void> {\n const rulesDir = join(process.cwd(), '.cursor', 'rules');\n\n // Create directory\n await fs.mkdir(rulesDir, { recursive: true });\n\n // Write all files\n for (const [filename, content] of Object.entries(bundle.files)) {\n const filePath = join(rulesDir, filename);\n await fs.writeFile(filePath, content, 'utf-8');\n console.log(`✓ Created .cursor/rules/${filename}`);\n }\n}\n\nasync function applyAgentsMdFormat(bundle: PresetBundle): Promise<void> {\n const sections: string[] = [];\n\n // Header\n sections.push('# AGENTS.md\\n');\n sections.push(`<!-- Generated by jai1 rules - Preset: ${bundle.preset.slug} v${bundle.preset.version} -->\\n`);\n\n // Extract content from each file (remove frontmatter)\n const fileOrder = [\n '01-project.mdc',\n '02-standards.mdc',\n '03-frontend.mdc',\n '04-backend.mdc',\n '05-testing.mdc',\n '06-workflow.mdc',\n '09-custom.mdc',\n ];\n\n for (const filename of fileOrder) {\n if (bundle.files[filename]) {\n const content = bundle.files[filename];\n // Remove frontmatter (---\\n...\\n---)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n/, '');\n sections.push(withoutFrontmatter.trim());\n sections.push('\\n');\n }\n }\n\n const agentsMd = sections.join('\\n');\n await fs.writeFile('AGENTS.md', agentsMd, 'utf-8');\n console.log('✓ Created AGENTS.md');\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface ProjectRulesConfig {\n preset: string;\n version: string;\n appliedAt: string;\n customContext: string;\n}\n\nexport function createRulesSyncCommand(): Command {\n return new Command('sync')\n .description('Regenerate rule outputs after editing custom context')\n .action(async () => {\n // Check if jai1-rules.json exists\n const configPath = join(process.cwd(), 'jai1-rules.json');\n let projectConfig: ProjectRulesConfig;\n\n try {\n const configContent = await fs.readFile(configPath, 'utf-8');\n projectConfig = JSON.parse(configContent) as ProjectRulesConfig;\n } catch {\n throw new ValidationError(\n 'No jai1-rules.json found. Run \"jai1 rules init\" first.'\n );\n }\n\n console.log('🔄 Syncing rules...\\n');\n console.log(`Preset: ${projectConfig.preset} v${projectConfig.version}`);\n\n // Check output format by detecting existing files\n const hasCursorRules = await checkPathExists('.cursor/rules');\n const hasAgentsMd = await checkPathExists('AGENTS.md');\n\n if (!hasCursorRules && !hasAgentsMd) {\n throw new ValidationError(\n 'No rule outputs found. Run \"jai1 rules init\" first.'\n );\n }\n\n // Regenerate based on what exists\n if (hasCursorRules) {\n await syncCursorFormat(projectConfig);\n }\n\n if (hasAgentsMd) {\n await syncAgentsMdFormat(projectConfig);\n }\n\n console.log('\\n✅ Rules synced successfully!\\n');\n });\n}\n\nasync function checkPathExists(path: string): Promise<boolean> {\n try {\n await fs.access(join(process.cwd(), path));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function syncCursorFormat(config: ProjectRulesConfig): Promise<void> {\n // Read 09-custom.mdc\n const customPath = join(process.cwd(), '.cursor', 'rules', config.customContext);\n\n try {\n await fs.access(customPath);\n console.log(`✓ Custom context found: ${config.customContext}`);\n } catch {\n console.log(`⚠️ Warning: ${config.customContext} not found in .cursor/rules/`);\n }\n\n console.log('✓ Cursor rules (.cursor/rules/) - no changes needed');\n console.log(' (Files are already in place, edit them directly)');\n}\n\nasync function syncAgentsMdFormat(config: ProjectRulesConfig): Promise<void> {\n // Read all rule files from .cursor/rules/\n const rulesDir = join(process.cwd(), '.cursor', 'rules');\n\n try {\n await fs.access(rulesDir);\n } catch {\n console.log('⚠️ Warning: .cursor/rules/ not found, cannot regenerate AGENTS.md');\n return;\n }\n\n const sections: string[] = [];\n\n // Header\n sections.push('# AGENTS.md\\n');\n sections.push(`<!-- Generated by jai1 rules - Preset: ${config.preset} v${config.version} -->\\n`);\n sections.push(`<!-- Last synced: ${new Date().toISOString()} -->\\n`);\n\n // File order\n const fileOrder = [\n '01-project.mdc',\n '02-standards.mdc',\n '03-frontend.mdc',\n '04-backend.mdc',\n '05-testing.mdc',\n '06-workflow.mdc',\n '09-custom.mdc',\n ];\n\n for (const filename of fileOrder) {\n const filePath = join(rulesDir, filename);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n // Remove frontmatter (---\\n...\\n---)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n/, '');\n sections.push(withoutFrontmatter.trim());\n sections.push('\\n');\n } catch {\n // File doesn't exist, skip\n continue;\n }\n }\n\n const agentsMd = sections.join('\\n');\n await fs.writeFile('AGENTS.md', agentsMd, 'utf-8');\n console.log('✓ Regenerated AGENTS.md');\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface ProjectRulesConfig {\n preset: string;\n version: string;\n appliedAt: string;\n customContext: string;\n}\n\nexport function createRulesInfoCommand(): Command {\n return new Command('info')\n .description('Show current preset information')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n // Check if jai1-rules.json exists\n const configPath = join(process.cwd(), 'jai1-rules.json');\n let projectConfig: ProjectRulesConfig;\n\n try {\n const configContent = await fs.readFile(configPath, 'utf-8');\n projectConfig = JSON.parse(configContent) as ProjectRulesConfig;\n } catch {\n throw new ValidationError(\n 'No jai1-rules.json found. Run \"jai1 rules init\" first.'\n );\n }\n\n if (options.json) {\n console.log(JSON.stringify(projectConfig, null, 2));\n return;\n }\n\n console.log('📋 Current Preset Information\\n');\n console.log(`Preset: ${projectConfig.preset}`);\n console.log(`Version: ${projectConfig.version}`);\n console.log(`Applied at: ${new Date(projectConfig.appliedAt).toLocaleString()}`);\n console.log(`Custom rules: ${projectConfig.customContext}`);\n\n // Check which outputs exist\n console.log('\\nOutput files:');\n\n const cursorRulesExists = await checkPathExists('.cursor/rules');\n const agentsMdExists = await checkPathExists('AGENTS.md');\n\n if (cursorRulesExists) {\n console.log(' ✓ .cursor/rules/');\n }\n\n if (agentsMdExists) {\n console.log(' ✓ AGENTS.md');\n }\n\n if (!cursorRulesExists && !agentsMdExists) {\n console.log(' (none found)');\n }\n\n console.log('\\nℹ️ Use \"jai1 rules sync\" to regenerate outputs after editing');\n });\n}\n\nasync function checkPathExists(path: string): Promise<boolean> {\n try {\n await fs.access(join(process.cwd(), path));\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Upgrade Command\n * Update jai1-client to the latest version\n * \n * Renamed from 'self-update' to 'upgrade' for clarity\n * - 'update' = update installed components\n * - 'upgrade' = upgrade the CLI tool itself\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create upgrade command\n */\nexport function createUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force upgrade without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleUpgrade(options);\n });\n}\n\nasync function handleUpgrade(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 upgrade\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Upgrade cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully upgraded to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('upgrade', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Upgrade failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually upgrading with:${colors.reset}`);\n\n // Show manual upgrade command for detected package manager\n const manualCommands = {\n npm: `npm install -g @jvittechs/jai1-cli@latest`,\n pnpm: `pnpm add -g @jvittechs/jai1-cli@latest`,\n yarn: `yarn global add @jvittechs/jai1-cli@latest`,\n bun: `bun add -g @jvittechs/jai1-cli@latest`\n };\n\n console.error(` ${colors.cyan}${manualCommands[packageManager]}${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager was used to install jai1\n * Priority:\n * 1. Check how jai1 was installed (via global bin path) - MOST RELIABLE\n * 2. Check npm_config_user_agent environment variable\n * 3. Default to npm (safest fallback)\n * \n * Supports both Windows and Unix paths\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // 1. Try to detect from actual jai1 installation path (MOST RELIABLE)\n try {\n const jai1Path = execSync('which jai1 || where jai1', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore']\n }).trim();\n\n if (jai1Path) {\n // Normalize path separators for consistent matching (Windows uses \\, Unix uses /)\n const normalizedPath = jai1Path.toLowerCase().replace(/\\\\/g, '/');\n\n // pnpm global paths:\n // - Unix: ~/.local/share/pnpm or ~/Library/pnpm\n // - Windows: C:/Users/username/AppData/Local/pnpm\n if (normalizedPath.includes('/pnpm/')) return 'pnpm';\n\n // yarn global paths:\n // - Unix: ~/.yarn or ~/Library/Yarn\n // - Windows: C:/Users/username/AppData/Local/Yarn\n if (normalizedPath.includes('/.yarn/') || normalizedPath.includes('/yarn/')) return 'yarn';\n\n // bun global paths:\n // - Unix: ~/.bun\n // - Windows: C:/Users/username/.bun\n if (normalizedPath.includes('/.bun/')) return 'bun';\n\n // npm global paths:\n // Unix:\n // - nvm: ~/.nvm/versions/node/vX.X.X/bin/\n // - system: /usr/local/bin/ or /usr/bin/\n // - npm prefix: ~/.npm-global/bin/ or similar\n // - node_modules: anywhere with /node_modules/.bin/\n // Windows:\n // - AppData: C:/Users/username/AppData/Roaming/npm/\n // - Program Files: C:/Program Files/nodejs/\n // - node_modules: anywhere with /node_modules/\n if (normalizedPath.includes('/.nvm/') ||\n normalizedPath.includes('/node_modules/') ||\n normalizedPath.includes('/lib/node_modules/') ||\n normalizedPath.includes('/npm-global/') ||\n normalizedPath.includes('/usr/local/bin/') ||\n normalizedPath.includes('/usr/bin/') ||\n normalizedPath.includes('/appdata/roaming/npm/') ||\n normalizedPath.includes('/program files/nodejs/')) {\n return 'npm';\n }\n }\n } catch {\n // Ignore errors, continue with other detection methods\n }\n\n // 2. Check user agent for package manager (when running via npm/pnpm/yarn scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Default to npm (safest and most common)\n // DO NOT check for available package managers here - it causes false positives!\n // If user has pnpm installed but used npm to install jai1, we should use npm.\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","/**\n * Clean Command\n * Clean up backups, cache, and temporary files\n * \n * Renamed from 'clear-backups' to 'clean' for broader scope\n */\nimport { Command } from 'commander';\nimport { confirm, select } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\ninterface CleanTarget {\n name: string;\n description: string;\n path: string;\n check: () => Promise<{ exists: boolean; count?: number; size?: string }>;\n clean: () => Promise<void>;\n}\n\n/**\n * Create clean command\n */\nexport function createCleanCommand(): Command {\n return new Command('clean')\n .description('Clean up backups, cache, and temporary files')\n .option('-y, --yes', 'Skip confirmation')\n .option('--backups', 'Clean only backup files')\n .option('--all', 'Clean all (backups + cache)')\n .action(async (options: { yes?: boolean; backups?: boolean; all?: boolean }) => {\n await handleClean(options);\n });\n}\n\nasync function handleClean(options: { yes?: boolean; backups?: boolean; all?: boolean }) {\n const cwd = process.cwd();\n const service = new ComponentsService();\n\n // Define clean targets\n const targets: CleanTarget[] = [\n {\n name: 'Backups',\n description: 'Component backup files (.jai1_backup/)',\n path: join(cwd, '.jai1_backup'),\n check: async () => {\n const backups = await service.listBackups(cwd);\n return { exists: backups.length > 0, count: backups.length };\n },\n clean: async () => {\n await service.clearBackups(cwd);\n }\n },\n // Future targets can be added here:\n // {\n // name: 'Cache',\n // description: 'Downloaded component cache',\n // path: join(homedir(), '.jai1', 'cache'),\n // ...\n // }\n ];\n\n console.log('🧹 Clean up jai1-client files\\n');\n\n // Check what's available to clean\n const availableTargets: Array<{ target: CleanTarget; info: { exists: boolean; count?: number } }> = [];\n\n for (const target of targets) {\n const info = await target.check();\n if (info.exists) {\n availableTargets.push({ target, info });\n }\n }\n\n if (availableTargets.length === 0) {\n console.log('✨ Nothing to clean up!');\n return;\n }\n\n // If specific option provided\n if (options.backups) {\n const backupTarget = targets.find(t => t.name === 'Backups');\n if (backupTarget) {\n await cleanTarget(backupTarget, options.yes);\n }\n return;\n }\n\n if (options.all) {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n return;\n }\n\n // Interactive mode\n console.log('Found the following items:\\n');\n for (const { target, info } of availableTargets) {\n const countStr = info.count ? ` (${info.count} items)` : '';\n console.log(` 📁 ${target.name}${countStr}`);\n console.log(` ${target.description}`);\n console.log(` Path: ${target.path}\\n`);\n }\n\n const action = await select({\n message: 'What do you want to clean?',\n choices: [\n ...availableTargets.map(({ target, info }) => ({\n name: `${target.name}${info.count ? ` (${info.count} items)` : ''}`,\n value: target.name\n })),\n { name: '🧹 Clean all', value: 'all' },\n { name: '❌ Cancel', value: 'cancel' }\n ]\n });\n\n if (action === 'cancel') {\n console.log('\\n❌ Operation cancelled.');\n return;\n }\n\n if (action === 'all') {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n } else {\n const target = targets.find(t => t.name === action);\n if (target) {\n await cleanTarget(target, options.yes);\n }\n }\n}\n\nasync function cleanTarget(target: CleanTarget, skipConfirm?: boolean): Promise<void> {\n const info = await target.check();\n\n if (!info.exists) {\n console.log(`✨ ${target.name}: Nothing to clean.`);\n return;\n }\n\n const countStr = info.count ? ` (${info.count} items)` : '';\n\n if (!skipConfirm) {\n const confirmed = await confirm({\n message: `Delete ${target.name}${countStr}?`,\n default: false\n });\n\n if (!confirmed) {\n console.log(`⏭️ Skipped ${target.name}`);\n return;\n }\n }\n\n try {\n await target.clean();\n console.log(`✅ Cleaned ${target.name}${countStr}`);\n } catch (error) {\n console.error(`❌ Failed to clean ${target.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { checkConnectivity } from '../../services/redmine-connectivity.service.js';\n\ninterface CheckOptions {\n config?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine check command\n */\nexport function createRedmineCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check Redmine connectivity')\n .option('-c, --config <path>', 'Config file path', 'redmine.config.yaml')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleRedmineCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleRedmineCheck(options: CheckOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const result = await checkConnectivity(config);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅', result.message);\n if (result.details?.project) {\n console.log(\n ` Project: ${result.details.project.name} (${result.details.project.identifier})`\n );\n console.log(` Project ID: ${result.details.project.id}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineConfigSchema } from '../types/redmine.types.js';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\n\n/**\n * Service for managing Redmine configuration\n */\nexport class RedmineConfigService {\n private configPath: string;\n\n constructor(configPath?: string) {\n this.configPath = configPath ?? resolve(process.cwd(), 'redmine.config.yaml');\n }\n\n /**\n * Load Redmine configuration from YAML file\n */\n async load(): Promise<RedmineConfig> {\n try {\n const content = await readFile(this.configPath, 'utf-8');\n const rawConfig = parse(content);\n\n return RedmineConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new NotFoundError(`Configuration file not found: ${this.configPath}`);\n }\n\n throw new ValidationError(\n `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate configuration object\n */\n validate(config: unknown): RedmineConfig {\n try {\n return RedmineConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\n// Export schema for use in types file\nexport { RedmineConfigSchema };\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst RetryConfigSchema = z.object({\n retries: z.number().min(0).default(3),\n baseMs: z.number().min(100).default(300),\n});\n\nconst FilenameConfigSchema = z.object({\n pattern: z.string().default('{issueId}-{slug}.md'),\n slug: z.object({\n maxLength: z.number().min(10).default(80),\n dedupe: z.boolean().default(true),\n lowercase: z.boolean().default(true),\n }),\n renameOnTitleChange: z.boolean().default(false),\n});\n\nconst CommentsConfigSchema = z.object({\n anchors: z.object({\n start: z.string().default('<!-- redmine:comments:start -->'),\n end: z.string().default('<!-- redmine:comments:end -->'),\n }),\n trackBy: z.enum(['journalId', 'createdOn']).default('journalId'),\n});\n\nconst DefaultsConfigSchema = z.object({\n include: z.array(z.enum(['journals', 'relations', 'attachments'])).default(['journals']),\n status: z.string().default('*'),\n pageSize: z.number().min(1).max(100).default(100),\n concurrency: z.number().min(1).max(10).default(4),\n retry: RetryConfigSchema.default({}),\n});\n\nconst ProjectConfigSchema = z.object({\n id: z.number(),\n identifier: z.string(),\n});\n\nconst RedmineConfigSchema = z.object({\n baseUrl: z.string().url(),\n apiAccessToken: z.string().min(1),\n project: ProjectConfigSchema,\n outputDir: z.string().default('.jai1/redmine'),\n defaults: DefaultsConfigSchema.default({}),\n filename: FilenameConfigSchema.default({}),\n comments: CommentsConfigSchema.default({}),\n});\n\nexport type RedmineConfig = z.infer<typeof RedmineConfigSchema>;\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\nexport type FilenameConfig = z.infer<typeof FilenameConfigSchema>;\nexport type CommentsConfig = z.infer<typeof CommentsConfigSchema>;\nexport type DefaultsConfig = z.infer<typeof DefaultsConfigSchema>;\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\n// Export schema for use in service\nexport { RedmineConfigSchema };\n","import { fetch } from 'undici';\nimport pRetry from 'p-retry';\nimport pLimit from 'p-limit';\nimport type { RedmineConfig, RetryConfig } from './config.js';\n\nexport interface RedmineIssue {\n id: number;\n subject: string;\n description: string;\n status: { id: number; name: string };\n priority: { id: number; name: string };\n author: { id: number; name: string };\n assigned_to?: { id: number; name: string };\n created_on: string;\n updated_on: string;\n project: { id: number; name: string };\n tracker: { id: number; name: string };\n journals?: RedmineJournal[];\n relations?: RedmineRelation[];\n attachments?: RedmineAttachment[];\n}\n\nexport interface RedmineJournal {\n id: number;\n user: { id: number; name: string };\n notes?: string;\n created_on: string;\n details?: Array<{\n name: string;\n old_value: string;\n new_value: string;\n }>;\n}\n\nexport interface RedmineRelation {\n id: number;\n issue_to_id: number;\n relation_type: string;\n delay?: number;\n}\n\nexport interface RedmineAttachment {\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: { id: number; name: string };\n created_on: string;\n content_url?: string;\n}\n\nexport interface RedmineIssueResponse {\n issue: RedmineIssue;\n}\n\nexport interface RedmineIssuesResponse {\n issues: RedmineIssue[];\n total_count: number;\n offset: number;\n limit: number;\n}\n\nexport interface RedmineProjectResponse {\n project: {\n id: number;\n identifier: string;\n name: string;\n created_on: string;\n updated_on: string;\n };\n}\n\nexport class RedmineApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: unknown\n ) {\n super(message);\n this.name = 'RedmineApiError';\n }\n}\n\nexport class RedmineApiClient {\n private readonly baseUrl: string;\n private readonly apiAccessToken: string;\n private readonly retryConfig: RetryConfig;\n private readonly concurrencyLimit: pLimit.Limit;\n\n constructor(config: RedmineConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiAccessToken = config.apiAccessToken;\n this.retryConfig = config.defaults.retry;\n this.concurrencyLimit = pLimit(config.defaults.concurrency);\n }\n\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers = {\n 'X-Redmine-API-Key': this.apiAccessToken,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const attempt = async (): Promise<T> => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = (await response.json()) as { errors?: string[] };\n if (errorData.errors && Array.isArray(errorData.errors)) {\n errorMessage = errorData.errors.join(', ');\n }\n } catch {\n // Ignore JSON parsing errors for error response\n }\n\n throw new RedmineApiError(errorMessage, response.status);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as unknown as T;\n };\n\n return pRetry(attempt, {\n retries: this.retryConfig.retries,\n onFailedAttempt: (error) => {\n console.warn(\n `Request failed (attempt ${error.attemptNumber}/${error.retriesLeft + 1}): ${error.message}`\n );\n },\n factor: 2,\n minTimeout: this.retryConfig.baseMs,\n maxTimeout: this.retryConfig.baseMs * 8,\n });\n }\n\n async checkConnectivity(): Promise<boolean> {\n try {\n await this.request<RedmineProjectResponse>('/projects.json?limit=1');\n return true;\n } catch (error) {\n if (error instanceof RedmineApiError) {\n throw error;\n }\n throw new RedmineApiError(\n `Connectivity check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async getProject(identifier: string): Promise<RedmineProjectResponse> {\n return this.request<RedmineProjectResponse>(`/projects/${identifier}.json`);\n }\n\n async getIssue(issueId: number, include?: string[]): Promise<RedmineIssueResponse> {\n const params = new URLSearchParams();\n if (include && include.length > 0) {\n params.append('include', include.join(','));\n }\n\n const path = `/issues/${issueId}.json${params.toString() ? `?${params.toString()}` : ''}`;\n return this.request<RedmineIssueResponse>(path);\n }\n\n async getIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n offset?: number;\n include?: string[];\n updatedSince?: string;\n } = {}\n ): Promise<RedmineIssuesResponse> {\n const params = new URLSearchParams();\n params.append('project_id', projectId.toString());\n\n if (options.status && options.status !== '*') {\n params.append('status_id', options.status);\n }\n\n if (options.pageSize) {\n params.append('limit', options.pageSize.toString());\n }\n\n if (options.offset) {\n params.append('offset', options.offset.toString());\n }\n\n if (options.include && options.include.length > 0) {\n params.append('include', options.include.join(','));\n }\n\n if (options.updatedSince) {\n params.append('updated_on', `>=${options.updatedSince}`);\n }\n\n const path = `/issues.json?${params.toString()}`;\n return this.request<RedmineIssuesResponse>(path);\n }\n\n async getAllIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n const allIssues: RedmineIssue[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n allIssues.push(...response.issues);\n\n if (options.onProgress) {\n options.onProgress(allIssues.length, response.total_count);\n }\n\n hasMore = allIssues.length < response.total_count;\n offset += pageSize;\n }\n\n return allIssues;\n }\n\n async getIssuesConcurrently(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n\n // First, get the total count\n const initialResponse = await this.getIssues(projectId, {\n ...options,\n pageSize: 1,\n });\n\n const totalCount = initialResponse.total_count;\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const pagePromises = Array.from({ length: totalPages }, (_, index) => {\n const offset = index * pageSize;\n\n return this.concurrencyLimit(async () => {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n if (options.onProgress) {\n options.onProgress(offset + response.issues.length, totalCount);\n }\n\n return response.issues;\n });\n });\n\n const pageResults = await Promise.all(pagePromises);\n return pageResults.flat();\n }\n}\n","import type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineApiClient, RedmineApiError } from '../api.js';\n\nexport interface ConnectivityResult {\n success: boolean;\n message: string;\n details?: {\n baseUrl: string;\n project?: {\n id: number;\n identifier: string;\n name: string;\n };\n };\n}\n\nexport async function checkConnectivity(config: RedmineConfig): Promise<ConnectivityResult> {\n const client = new RedmineApiClient(config);\n\n try {\n const isConnected = await client.checkConnectivity();\n\n if (!isConnected) {\n return {\n success: false,\n message: 'Failed to connect to Redmine API',\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n const projectResponse = await client.getProject(config.project.identifier);\n\n return {\n success: true,\n message: `Successfully connected to Redmine and found project \"${projectResponse.project.name}\"`,\n details: {\n baseUrl: config.baseUrl,\n project: projectResponse.project,\n },\n };\n } catch (error) {\n if (error instanceof RedmineApiError) {\n let message = `Redmine API error: ${error.message}`;\n\n if (error.status === 401) {\n message = 'Authentication failed - please check your API access token';\n } else if (error.status === 403) {\n message = 'Access forbidden - insufficient permissions for the project';\n } else if (error.status === 404) {\n message = `Project \"${config.project.identifier}\" not found or inaccessible`;\n }\n\n return {\n success: false,\n message,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n return {\n success: false,\n message: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncIssue, extractIssueIdFromUrl } from '../../sync-issue.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface SyncIssueOptions {\n id?: string;\n url?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync issue command\n */\nexport function createSyncIssueCommand(): Command {\n const cmd = new Command('issue')\n .description('Sync a single issue')\n .option('-i, --id <number>', 'Issue ID')\n .option('-u, --url <url>', 'Issue URL')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncIssueOptions) => {\n await handleSyncIssue(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncIssue(options: SyncIssueOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n let issueId: number;\n\n if (options.id) {\n issueId = parseInt(options.id, 10);\n if (isNaN(issueId)) {\n throw new ValidationError('Invalid issue ID');\n }\n } else if (options.url) {\n const extractedId = extractIssueIdFromUrl(options.url);\n if (!extractedId) {\n throw new ValidationError('Could not extract issue ID from URL');\n }\n issueId = extractedId;\n } else {\n throw new ValidationError('Either --id or --url must be provided');\n }\n\n const result = await syncIssue(issueId, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n const icon = result.action === 'skipped' ? '⏭️' : '✅';\n console.log(`${icon} ${result.message}`);\n if (result.filePath) {\n console.log(` File: ${result.filePath}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { resolve, relative } from 'node:path';\nimport type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport {\n mapIssueToFrontmatter,\n mapIssueToContent,\n mapJournalsToComments,\n extractNewJournals,\n shouldUpdateIssue,\n shouldUpdateComments,\n} from './mappers.js';\nimport { generateFilename } from './slug.util.js';\nimport {\n readMarkdownFile,\n writeMarkdownFile,\n extractIssueIdFromFrontmatter,\n extractLastJournalId,\n} from './file.util.js';\n\nexport interface SyncIssueOptions {\n dryRun?: boolean;\n outputDir?: string;\n}\n\nexport interface SyncIssueResult {\n success: boolean;\n issueId: number;\n filename: string;\n filePath: string;\n action: 'created' | 'updated' | 'skipped';\n message: string;\n changes?: {\n content?: boolean;\n comments?: boolean;\n frontmatter?: boolean;\n };\n}\n\nexport async function syncIssue(\n issueId: number,\n config: RedmineConfig,\n options: SyncIssueOptions = {}\n): Promise<SyncIssueResult> {\n const client = new RedmineApiClient(config);\n const outputDir = options.outputDir || config.outputDir;\n\n try {\n const include = config.defaults.include;\n const response = await client.getIssue(issueId, include);\n const issue = response.issue;\n\n const filename = generateFilename(issue.id, issue.subject, config.filename);\n const filePath = resolve(outputDir, filename);\n const relativePath = relative(process.cwd(), filePath);\n\n const existingFile = await readMarkdownFile(filePath);\n const existingIssueId = extractIssueIdFromFrontmatter(existingFile.frontmatter);\n const existingLastJournalId = extractLastJournalId(existingFile.frontmatter);\n\n if (existingIssueId && existingIssueId !== issue.id) {\n return {\n success: false,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `File ${filename} contains issue ${existingIssueId}, not ${issue.id}`,\n };\n }\n\n const needsUpdate = shouldUpdateIssue(issue, existingFile.frontmatter);\n const needsCommentsUpdate = shouldUpdateComments(\n issue.journals || [],\n existingFile.frontmatter\n );\n\n if (!needsUpdate && !needsCommentsUpdate) {\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `Issue ${issueId} is already up to date`,\n };\n }\n\n const frontmatter = mapIssueToFrontmatter(issue);\n const content = mapIssueToContent(issue);\n\n let comments: string | undefined;\n if (needsCommentsUpdate && issue.journals) {\n const newJournals = extractNewJournals(issue.journals, existingLastJournalId);\n if (newJournals.length > 0) {\n const newComments = mapJournalsToComments(newJournals, config.comments);\n if (existingFile.comments) {\n comments = `${existingFile.comments}\\n\\n---\\n\\n${newComments}`;\n } else {\n comments = newComments;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n\n const changes: SyncIssueResult['changes'] = {};\n if (needsUpdate) {\n changes.frontmatter = true;\n changes.content = true;\n }\n if (needsCommentsUpdate) {\n changes.comments = true;\n }\n\n if (options.dryRun) {\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Would ${action} issue ${issueId} (dry run)`,\n changes,\n };\n }\n\n await writeMarkdownFile(\n filePath,\n {\n frontmatter,\n content,\n comments,\n },\n config.comments\n );\n\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Successfully ${action} issue ${issueId}`,\n changes,\n };\n } catch (error) {\n return {\n success: false,\n issueId,\n filename: '',\n filePath: '',\n action: 'skipped',\n message: `Failed to sync issue ${issueId}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport function extractIssueIdFromUrl(url: string): number | null {\n const match = url.match(/\\/issues\\/(\\d+)(?:\\/|$)/);\n if (match) {\n const issueId = parseInt(match[1], 10);\n return isNaN(issueId) ? null : issueId;\n }\n return null;\n}\n","import type { RedmineIssue, RedmineJournal } from './api.js';\nimport type { CommentsConfig } from './config.js';\n\nexport interface IssueFrontmatter {\n id: number;\n subject: string;\n status: string;\n priority: string;\n author: string;\n assigned_to?: string;\n created_on: string;\n updated_on: string;\n project: string;\n tracker: string;\n lastJournalId?: number;\n relations?: Array<{\n type: string;\n issue_id: number;\n delay?: number;\n }>;\n attachments?: Array<{\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: string;\n created_on: string;\n content_url?: string;\n }>;\n}\n\nexport function mapIssueToFrontmatter(issue: RedmineIssue): IssueFrontmatter {\n const frontmatter: IssueFrontmatter = {\n id: issue.id,\n subject: issue.subject,\n status: issue.status.name,\n priority: issue.priority.name,\n author: issue.author.name,\n created_on: issue.created_on,\n updated_on: issue.updated_on,\n project: issue.project.name,\n tracker: issue.tracker.name,\n };\n\n if (issue.assigned_to) {\n frontmatter.assigned_to = issue.assigned_to.name;\n }\n\n if (issue.relations && issue.relations.length > 0) {\n frontmatter.relations = issue.relations.map((relation) => ({\n type: relation.relation_type,\n issue_id: relation.issue_to_id,\n delay: relation.delay,\n }));\n }\n\n if (issue.attachments && issue.attachments.length > 0) {\n frontmatter.attachments = issue.attachments.map((attachment) => ({\n id: attachment.id,\n filename: attachment.filename,\n filesize: attachment.filesize,\n content_type: attachment.content_type,\n author: attachment.author.name,\n created_on: attachment.created_on,\n content_url: attachment.content_url,\n }));\n }\n\n if (issue.journals && issue.journals.length > 0) {\n const lastJournal = issue.journals.reduce((latest, journal) =>\n journal.id > latest.id ? journal : latest\n );\n frontmatter.lastJournalId = lastJournal.id;\n }\n\n return frontmatter;\n}\n\nexport function mapIssueToContent(issue: RedmineIssue): string {\n let content = '';\n\n if (issue.description) {\n content += issue.description;\n }\n\n return content;\n}\n\nexport function mapJournalsToComments(journals: RedmineJournal[], config: CommentsConfig): string {\n if (!journals || journals.length === 0) {\n return '';\n }\n\n let comments = '';\n\n const sortedJournals = [...journals].sort((a, b) => {\n if (config.trackBy === 'journalId') {\n return a.id - b.id;\n }\n return new Date(a.created_on).getTime() - new Date(b.created_on).getTime();\n });\n\n for (const journal of sortedJournals) {\n if (!journal.notes || journal.notes.trim() === '') {\n continue;\n }\n\n const date = new Date(journal.created_on).toISOString().split('T')[0];\n const time = new Date(journal.created_on).toTimeString().split(' ')[0].substring(0, 5);\n\n comments += `## ${journal.user.name} - ${date} ${time}\\n\\n`;\n comments += `${journal.notes}\\n\\n`;\n\n if (journal.details && journal.details.length > 0) {\n comments += '**Changes:**\\n';\n for (const detail of journal.details) {\n const oldValue = detail.old_value || '(none)';\n const newValue = detail.new_value || '(none)';\n comments += `- ${detail.name}: ${oldValue} → ${newValue}\\n`;\n }\n comments += '\\n';\n }\n\n comments += '---\\n\\n';\n }\n\n return comments.trim();\n}\n\nexport function extractNewJournals(\n allJournals: RedmineJournal[],\n lastJournalId: number | null\n): RedmineJournal[] {\n if (!lastJournalId) {\n return allJournals;\n }\n\n return allJournals.filter((journal) => journal.id > lastJournalId);\n}\n\nexport function shouldUpdateIssue(\n remoteIssue: RedmineIssue,\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localUpdatedOn = localFrontmatter.updated_on as string;\n const remoteUpdatedOn = remoteIssue.updated_on;\n\n if (!localUpdatedOn) {\n return true;\n }\n\n return new Date(remoteUpdatedOn) > new Date(localUpdatedOn);\n}\n\nexport function shouldUpdateComments(\n remoteJournals: RedmineJournal[],\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localLastJournalId = localFrontmatter.lastJournalId as number;\n\n if (!localLastJournalId) {\n return remoteJournals.length > 0;\n }\n\n return remoteJournals.some((journal) => journal.id > localLastJournalId);\n}\n","import slugify from 'slugify';\nimport type { FilenameConfig } from './config.js';\n\nexport function generateSlug(\n title: string,\n config: FilenameConfig['slug'],\n existingSlugs: Set<string> = new Set()\n): string {\n let slug = slugify(title, {\n lower: config.lowercase,\n strict: true,\n remove: /[^\\w\\s-]/g,\n });\n\n slug = slug.substring(0, config.maxLength);\n\n if (!config.dedupe) {\n return slug;\n }\n\n let finalSlug = slug;\n let counter = 1;\n\n while (existingSlugs.has(finalSlug)) {\n const suffix = `-${counter}`;\n const maxLength = config.maxLength - suffix.length;\n finalSlug = `${slug.substring(0, maxLength)}${suffix}`;\n counter++;\n }\n\n existingSlugs.add(finalSlug);\n return finalSlug;\n}\n\nexport function generateFilename(\n issueId: number,\n title: string,\n config: FilenameConfig,\n existingSlugs: Set<string> = new Set()\n): string {\n const slug = generateSlug(title, config.slug, existingSlugs);\n\n return config.pattern.replace('{issueId}', issueId.toString()).replace('{slug}', slug);\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport matter from 'gray-matter';\nimport type { CommentsConfig } from './config.js';\n\nexport interface MarkdownData {\n frontmatter: Record<string, unknown>;\n content: string;\n comments?: string;\n}\n\nexport interface ParsedMarkdown {\n frontmatter: Record<string, unknown>;\n content: string;\n comments: string | null;\n rawContent: string;\n}\n\nexport async function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n}\n\nexport async function readMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return parseMarkdownContent(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: '',\n };\n }\n throw error;\n }\n}\n\nexport function parseMarkdownContent(content: string): ParsedMarkdown {\n if (!content.trim()) {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: content,\n };\n }\n\n const { data: frontmatter, content: body } = matter(content);\n\n const comments = extractCommentsSection(body);\n const mainContent = removeCommentsSection(body);\n\n return {\n frontmatter,\n content: mainContent,\n comments,\n rawContent: content,\n };\n}\n\nexport function extractCommentsSection(content: string): string | null {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return null;\n }\n\n const startIndex = content.indexOf(startMatch[0]) + startMatch[0].length;\n const endIndex = content.indexOf(endMatch[0]);\n\n if (startIndex >= endIndex) {\n return null;\n }\n\n return content.substring(startIndex, endIndex).trim();\n}\n\nexport function removeCommentsSection(content: string): string {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return content;\n }\n\n const startIndex = content.indexOf(startMatch[0]);\n const endIndex = content.indexOf(endMatch[0]) + endMatch[0].length;\n\n return content.substring(0, startIndex) + content.substring(endIndex).trim();\n}\n\nexport function buildMarkdownContent(data: MarkdownData, config: CommentsConfig): string {\n let content = '';\n\n if (Object.keys(data.frontmatter).length > 0) {\n const frontmatterYaml = matter.stringify('', data.frontmatter).replace(/^---\\n|\\n---\\n?$/g, '');\n content += `---\\n${frontmatterYaml}---\\n\\n`;\n }\n\n content += data.content;\n\n if (data.comments) {\n content += `\\n\\n${config.anchors.start}\\n${data.comments}\\n${config.anchors.end}`;\n }\n\n return content;\n}\n\nexport async function writeMarkdownFile(\n filePath: string,\n data: MarkdownData,\n config: CommentsConfig\n): Promise<void> {\n await ensureDir(filePath);\n const content = buildMarkdownContent(data, config);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function extractIssueIdFromFrontmatter(frontmatter: Record<string, unknown>): number | null {\n const id = frontmatter.id as number | string | undefined;\n if (typeof id === 'number') {\n return id;\n }\n if (typeof id === 'string') {\n const parsed = parseInt(id, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\nexport function extractLastJournalId(frontmatter: Record<string, unknown>): number | null {\n const lastJournalId = frontmatter.lastJournalId as number | string | undefined;\n if (typeof lastJournalId === 'number') {\n return lastJournalId;\n }\n if (typeof lastJournalId === 'string') {\n const parsed = parseInt(lastJournalId, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncProject } from '../../sync-project.js';\n\ninterface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n concurrency?: string;\n pageSize?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync project command\n */\nexport function createSyncProjectCommand(): Command {\n const cmd = new Command('project')\n .description('Sync all issues in a project')\n .option('-s, --status <status>', 'Filter by status (default: *)', '*')\n .option('--updated-since <date>', 'Only sync issues updated since YYYY-MM-DD')\n .option('--concurrency <number>', 'Number of concurrent requests')\n .option('--page-size <number>', 'Page size for API requests')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncProjectOptions) => {\n await handleSyncProject(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncProject(options: SyncProjectOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const syncOptions: Parameters<typeof syncProject>[1] = {\n status: options.status,\n updatedSince: options.updatedSince,\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n ...(options.concurrency && { concurrency: parseInt(options.concurrency, 10) }),\n ...(options.pageSize && { pageSize: parseInt(options.pageSize, 10) }),\n onProgress: options.json\n ? undefined\n : (current: number, total: number) => {\n process.stdout.write(`\\rProgress: ${current}/${total} issues`);\n },\n };\n\n const result = await syncProject(config, syncOptions);\n\n if (!options.json) {\n process.stdout.write('\\r'); // Clear progress line\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅ Sync completed successfully');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n if (result.failed > 0) {\n console.log(` Failed: ${result.failed}`);\n }\n } else {\n console.log('❌ Sync completed with errors');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n console.log(` Failed: ${result.failed}`);\n\n if (result.errors.length > 0) {\n console.log('\\nErrors:');\n result.errors.forEach((error) => {\n console.log(` Issue ${error.issueId}: ${error.error}`);\n });\n }\n\n process.exit(5);\n }\n }\n}\n","import type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport { syncIssue } from './sync-issue.js';\n\nexport interface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n dryRun?: boolean;\n outputDir?: string;\n concurrency?: number;\n pageSize?: number;\n onProgress?: (current: number, total: number) => void;\n}\n\nexport interface SyncProjectResult {\n success: boolean;\n totalIssues: number;\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n errors: Array<{\n issueId: number;\n error: string;\n }>;\n}\n\nexport async function syncProject(\n config: RedmineConfig,\n options: SyncProjectOptions = {}\n): Promise<SyncProjectResult> {\n const client = new RedmineApiClient(config);\n const pageSize = options.pageSize || config.defaults.pageSize;\n\n const result: SyncProjectResult = {\n success: true,\n totalIssues: 0,\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n failed: 0,\n errors: [],\n };\n\n try {\n const issues = await client.getIssuesConcurrently(config.project.id, {\n status: options.status || config.defaults.status,\n pageSize,\n include: config.defaults.include,\n updatedSince: options.updatedSince,\n onProgress: options.onProgress,\n });\n\n result.totalIssues = issues.length;\n\n if (issues.length === 0) {\n return result;\n }\n\n const syncPromises = issues.map(async (issue) => {\n const syncResult = await syncIssue(issue.id, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n result.processed++;\n\n if (syncResult.success) {\n switch (syncResult.action) {\n case 'created':\n result.created++;\n break;\n case 'updated':\n result.updated++;\n break;\n case 'skipped':\n result.skipped++;\n break;\n }\n } else {\n result.failed++;\n result.errors.push({\n issueId: syncResult.issueId,\n error: syncResult.message,\n });\n }\n\n return syncResult;\n });\n\n await Promise.all(syncPromises);\n\n result.success = result.failed === 0;\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push({\n issueId: 0,\n error: `Failed to fetch issues: ${error instanceof Error ? error.message : String(error)}`,\n });\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../../types/framework.types.js';\n\n/**\n * Create info command for Jai1 Framework\n * Shows configuration and status information\n */\nexport function createInfoCommand(): Command {\n const cmd = new Command('info')\n .description('Show jai1-client configuration and status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleInfo(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('Jai1 Client Info');\n console.log('────────────────\\n');\n console.log(`Config Location: ${info.configPath}`);\n console.log(`API URL: ${info.apiUrl}`);\n console.log(`Access Key: ${info.accessKey}`);\n console.log(`Framework Version: ${info.version}`);\n console.log(`Last Updated: ${info.lastUpdated}`);\n console.log(`Framework Location: ${info.frameworkPath}`);\n console.log();\n console.log('Project Status:');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Synced version: ${info.projectStatus.version || 'Unknown'}`);\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create self-update command\n */\nexport function createSelfUpdateCommand(): Command {\n return new Command('self-update')\n .description('Update jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force update without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleSelfUpdate(options);\n });\n}\n\nasync function handleSelfUpdate(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 self-update\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Update cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully updated to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('self_update', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Update failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually updating with:${colors.reset}`);\n console.error(` ${colors.cyan}npm install -g @jvittechs/jai1-cli@latest${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager is being used\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check user agent for package manager\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Check which command is available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n try {\n execSync('bun --version', { stdio: 'ignore' });\n return 'bun';\n } catch {\n // bun not available\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\n\nexport function createClearBackupsCommand(): Command {\n return new Command('clear-backups')\n .description('Clear backup files')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const service = new ComponentsService();\n const backups = await service.listBackups(process.cwd());\n\n if (backups.length === 0) {\n console.log('No backups found.');\n return;\n }\n\n console.log(`Found ${backups.length} backup(s):`);\n if (backups.length <= 5) {\n backups.forEach(b => console.log(` - ${b}`));\n } else {\n backups.slice(0, 5).forEach(b => console.log(` - ${b}`));\n console.log(` ...and ${backups.length - 5} more`);\n }\n console.log();\n\n if (!options.yes) {\n const ok = await confirm({ message: 'Delete all backups?', default: false });\n if (!ok) return;\n }\n\n await service.clearBackups(process.cwd());\n console.log('✅ Backups cleared.');\n });\n}\n","import { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Tắt tất cả telemetry và thu thập dữ liệu',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Tắt/giảm tải các language servers (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Tắt Git tích hợp để cải thiện hiệu suất',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Loại trừ các thư mục khỏi file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Loại trừ các thư mục khỏi search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Tắt auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Tối ưu rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Ẩn các UI elements không cần thiết',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\nexport function createVSCodeCommand(): Command {\n const vscodeCommand = new Command('vscode')\n .description('Quản lý cài đặt VSCode cho dự án hiện tại');\n\n // Interactive mode (default)\n vscodeCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n vscodeCommand\n .command('enable')\n .description('Enable các nhóm tối ưu cụ thể')\n .argument('[groups...]', 'Tên các nhóm cần enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n vscodeCommand\n .command('disable')\n .description('Disable các nhóm tối ưu cụ thể (restore về default)')\n .argument('[groups...]', 'Tên các nhóm cần disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n vscodeCommand\n .command('max-performance')\n .description('Enable tất cả các tối ưu để đạt hiệu suất tối đa')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n vscodeCommand\n .command('reset')\n .description('Reset về settings mặc định (xóa tất cả tối ưu)')\n .argument('[groups...]', 'Tên các nhóm cần reset (để trống = reset tất cả)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n vscodeCommand\n .command('list')\n .description('Liệt kê tất cả các nhóm tối ưu có sẵn')\n .action(() => {\n console.log('🔧 Các nhóm tối ưu có sẵn:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return vscodeCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 Quản lý cài đặt VSCode\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Hướng dẫn sử dụng: │');\n console.log('│ • Dùng phím ↑↓ để di chuyển │');\n console.log('│ • Nhấn SPACE để chọn/bỏ chọn nhóm │');\n console.log('│ • Nhấn ENTER để xác nhận và áp dụng │');\n console.log('│ • Nhấn Ctrl+C để hủy │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'Bạn muốn làm gì?',\n choices: [\n { name: '✅ Enable các nhóm tối ưu', value: 'enable' },\n { name: '❌ Disable các nhóm tối ưu', value: 'disable' },\n { name: '🚀 Max Performance (enable tất cả)', value: 'max' },\n { name: '🔄 Reset về mặc định', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Chọn các nhóm để ${action === 'enable' ? 'enable' : 'disable'} (SPACE để chọn, ENTER để xác nhận):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn nhóm nào!');\n console.log(' 💡 Mẹo: Hãy nhấn SPACE để chọn ít nhất 1 nhóm trước khi nhấn ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Đã hủy thao tác.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Nhóm không hợp lệ: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Chạy \"jai1 vscode list\" để xem danh sách nhóm có sẵn.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Đã tạo thư mục .vscode/');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Đã đọc cài đặt hiện tại từ settings.json');\n } catch {\n console.warn('⚠️ Không thể đọc settings.json (có thể chứa comments).');\n const confirmOverwrite = await confirm({\n message: 'Ghi đè file settings.json hiện tại?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 Đang ${action === 'enable' ? 'enable' : 'disable'} các nhóm:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Đã cập nhật cài đặt VSCode tại: ${settingsPath}`);\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ Không tìm thấy file settings.json');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset TẤT CẢ settings về mặc định (xóa toàn bộ file)?'\n : `Reset các nhóm: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Đã xóa file settings.json');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create guide command - Agentic Coding guide center\n */\nexport function createGuideCommand(): Command {\n const cmd = new Command('guide')\n .description('Interactive guide center for Agentic Coding')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../types/context.types.js';\nimport { ContextScannerService } from '../services/context-scanner.service.js';\n\n/**\n * Create context command - Visualize project context\n */\nexport function createContextCommand(): Command {\n const cmd = new Command('context')\n .description('Khám phá và quản lý context dự án cho các IDE')\n .option('--ide <ide>', 'Mở trực tiếp IDE cụ thể (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Hiển thị loại context cụ thể (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Hiển thị thống kê context (non-interactive)')\n .action(async (options: { ide?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.ide) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.ide)) {\n console.error(`❌ IDE không hợp lệ: ${options.ide}`);\n console.error(` IDE hợp lệ: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.ide as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Loại context không hợp lệ: ${options.type}`);\n console.error(` Loại hợp lệ: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Đang quét context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ Không tìm thấy context nào');\n console.log(' Hãy chạy `jai1 apply` để cài đặt context cho IDE của bạn.\\n');\n return;\n }\n\n console.log('📊 Thống kê Context\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('vi-VN')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Tổng: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Lỗi khi quét context:', error);\n process.exit(1);\n }\n}\n","/**\n * migrate-ide command - Migrate .jai1 content to IDE directories\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../constants/ide-migration-configs.js';\n\n/**\n * Create migrate-ide command\n */\nexport function createMigrateIdeCommand(): Command {\n const cmd = new Command('migrate-ide')\n .description('Migrate .jai1 rules và workflows sang IDEs (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runMigrateIde(options);\n });\n\n return cmd;\n}\n\nasync function runMigrateIde(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Migrate rules và workflows sang IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ Không tìm thấy content trong .jai1/');\n console.log(' 💡 Hãy tạo files trong .jai1/rules/ hoặc .jai1/workflows/ trước.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Chọn IDE(s) để migrate (SPACE để chọn, ENTER để xác nhận):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn IDE nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Chọn content types để migrate:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn content type nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with migration?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Migration cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Migrating...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Migration complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n"],"mappings":"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","names":["Command","homedir","homedir","resolve","Command","fs","join","homedir","join","homedir","fs","fs","join","homedir","Command","React","Command","React","Box","Text","React","Text","React","Text","input","React","Box","Text","Command","React","Command","Command","Command","Command","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","fs","fs","useApp","useState","useEffect","useInput","input","React","Box","Text","Command","render","React","Command","confirm","fs","path","Command","checkbox","confirm","fs","path","matter","path","fs","matter","Command","checkbox","confirm","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","input","React","React","Box","Text","React","React","React","React","React","React","React","React","React","React","useState","Box","Text","useInput","TextInput","Spinner","input","resolve","useApp","useState","useEffect","useInput","input","React","Box","Text","Command","render","React","Command","React","render","React","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","useApp","Spinner","useState","useState","useEffect","useCallback","React","memo","Box","Text","Spinner","React","Box","Text","React","memo","Box","Text","TextInput","memo","React","Box","Text","Spinner","React","useState","Box","Text","useInput","input","useApp","useRef","useState","useEffect","useMemo","useCallback","useInput","input","React","Box","Text","Spinner","render","React","Command","Command","maskKey","Command","Command","Command","Command","fs","path","input","input","Command","Command","Command","input","Command","Command","Command","Command","input","Command","Command","readFile","input","readFile","Command","Command","readFile","input","readFile","Command","Command","readFile","readFile","Command","Command","Command","Command","input","Command","Command","Command","Command","input","Command","Command","input","Command","Command","Command","readFile","React","render","React","useState","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","fs","path","input","marked","MENU_ITEMS","useState","useApp","useInput","input","React","Box","Text","resolve","render","React","Command","Command","Command","checkbox","confirm","fs","path","pLimit","colors","Command","checkbox","pkg","confirm","Command","Command","Command","fs","join","join","fs","Command","Command","Command","Command","fs","join","select","checkbox","execa","Command","execa","join","fs","select","checkbox","Command","Command","Command","Command","Command","fs","join","select","confirm","Command","select","confirm","fs","join","Command","fs","join","Command","join","fs","path","Command","fs","join","Command","join","fs","checkPathExists","path","Command","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","execSync","Command","confirm","select","join","Command","select","confirm","Command","readFile","resolve","z","resolve","readFile","z","fetch","pRetry","pLimit","path","Command","Command","resolve","readFile","writeFile","matter","resolve","action","Command","Command","Command","Command","fs","join","homedir","Command","getProjectStatus","maskKey","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","detectPackageManager","getInstallCommand","execSync","Command","confirm","Command","confirm","Command","checkbox","confirm","select","fs","path","existsSync","PERFORMANCE_GROUPS","interactiveMode","selectGroupsToApply","applyGroups","resetSettings","React","render","Command","Command","render","React","React","render","Command","Command","printStats","render","React","Command","checkbox","confirm","Command","checkbox","confirm","Command"]}
|