@jawkit.cc/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +31 -0
- package/README.md +363 -0
- package/content/claude-code/free.tar.gz +0 -0
- package/content/claude-code/professional.tar.gz +0 -0
- package/content/github-copilot/free.tar.gz +0 -0
- package/content/manifest.json +50 -0
- package/dist/chunk-V3HNAAHL.js +1369 -0
- package/dist/chunk-V3HNAAHL.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1180 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/agents/base-agent.ts","../src/agents/claude-code/index.ts","../src/agents/github-copilot/index.ts","../src/agents/registry.ts","../src/lib/promo.ts","../src/commands/auth.ts","../src/commands/version.ts","../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { version, description } from '../package.json';\nimport {\n initCommand,\n authCommand,\n versionCommand,\n upgradeCommand,\n} from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('jawkit')\n .description(description)\n .version(version, '-v, --version', 'Show CLI version');\n\n// Add commands\nprogram.addCommand(initCommand());\nprogram.addCommand(authCommand());\nprogram.addCommand(versionCommand());\nprogram.addCommand(upgradeCommand());\n\n// Default action when no command is provided\nprogram.action(() => {\n program.help();\n});\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { select, confirm } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { Logger } from '../lib/logger.js';\nimport { handleError, AgentError } from '../lib/errors.js';\nimport { ConfigService } from '../lib/config.js';\nimport { getAuthService, getTierDisplayName } from '../auth/index.js';\nimport { agentRegistry } from '../agents/index.js';\nimport type { Agent } from '../agents/types.js';\nimport { getContentService } from '../content/index.js';\nimport { showPromoIfFree } from '../lib/promo.js';\n\ninterface InitOptions {\n agent?: string;\n yes?: boolean;\n dryRun?: boolean;\n}\n\nexport function initCommand(): Command {\n return new Command('init')\n .description('Initialize JawKit content for a coding agent')\n .option('-a, --agent <agent>', 'Agent to install (claude-code, github-copilot)')\n .option('-y, --yes', 'Skip confirmation prompts')\n .option('--dry-run', 'Show what would be installed without making changes')\n .action(async (options: InitOptions) => {\n const logger = new Logger({});\n const authService = getAuthService();\n const contentService = getContentService();\n const projectPath = process.cwd();\n\n try {\n logger.info('JawKit Init');\n logger.divider();\n\n // 1. Check authentication and get user tier\n const isAuthenticated = await authService.isAuthenticated();\n const user = isAuthenticated ? await authService.getCurrentUser() : null;\n const userTier = user?.tier ?? 'free';\n\n if (isAuthenticated && user) {\n logger.info(`Licensed: ${chalk.cyan(user.email)} (${getTierDisplayName(userTier)})`);\n } else {\n logger.info(chalk.yellow('No license - using free tier content'));\n logger.info(chalk.dim(\"Run 'jawkit auth activate <key>' or 'jawkit auth redeem' for Professional\"));\n logger.info(chalk.dim(`Purchase at ${chalk.cyan('https://jawkit.cc/pro')}`));\n }\n logger.divider();\n\n // 2. Select or detect agent\n let agent: Agent;\n\n if (options.agent) {\n // Use specified agent\n const specifiedAgent = agentRegistry.get(options.agent);\n if (!specifiedAgent) {\n const availableIds = agentRegistry.getIds().join(', ');\n throw AgentError.notFound(`${options.agent}. Available: ${availableIds}`);\n }\n agent = specifiedAgent;\n } else {\n // Detect or prompt for agent\n const detectedAgents = await agentRegistry.detectAgents(projectPath);\n\n if (detectedAgents.length === 0) {\n // Default to Claude Code\n const defaultAgent = agentRegistry.get('claude-code');\n if (!defaultAgent) {\n throw new Error('Claude Code agent not found');\n }\n agent = defaultAgent;\n logger.info(`No specific agent detected, using ${chalk.cyan(agent.config.name)}`);\n } else if (detectedAgents.length === 1) {\n const singleAgent = detectedAgents[0];\n if (!singleAgent) {\n throw new Error('No agent found');\n }\n agent = singleAgent;\n logger.info(`Detected ${chalk.cyan(agent.config.name)}`);\n } else if (options.yes) {\n // Use highest priority agent in yes mode\n const firstAgent = detectedAgents[0];\n if (!firstAgent) {\n throw new Error('No agent found');\n }\n agent = firstAgent;\n logger.info(`Using ${chalk.cyan(agent.config.name)} (highest priority)`);\n } else {\n // Prompt user to select\n const selectedId = await select({\n message: 'Select agent to initialize:',\n choices: detectedAgents.map((a) => ({\n name: a.config.name,\n value: a.config.id,\n description: a.config.description,\n })),\n });\n agent = agentRegistry.get(selectedId)!;\n }\n }\n\n logger.info(`Agent: ${chalk.cyan(agent.config.name)}`);\n logger.info(`Target: ${chalk.dim(agent.config.targetDirectory + '/')}`);\n logger.divider();\n\n // TODO: Content type selection disabled - extracts all content for now\n // Re-enable when filtering is implemented in extractor\n\n // Get bundle info\n const bundleInfo = await contentService.getBundleInfo(agent.config.id, userTier);\n logger.info(`Bundle size: ${chalk.dim(formatBytes(bundleInfo.size))}`);\n logger.info(`Files: ${chalk.dim(bundleInfo.fileCount.toString())}`);\n\n // 5. Confirm installation\n if (!options.yes && !options.dryRun) {\n const shouldContinue = await confirm({\n message: 'Proceed with installation?',\n default: true,\n });\n\n if (!shouldContinue) {\n logger.info('Installation cancelled');\n return;\n }\n }\n\n // 6. Check for existing directory and backup if needed\n const targetDir = path.join(projectPath, agent.config.targetDirectory);\n let backupPath: string | null = null;\n\n try {\n const stats = await fs.stat(targetDir);\n if (stats.isDirectory()) {\n backupPath = `${targetDir}.backup`;\n logger.info(chalk.yellow(`Existing ${agent.config.targetDirectory}/ found - will backup to ${agent.config.targetDirectory}.backup/`));\n }\n } catch {\n // Directory doesn't exist, no backup needed\n }\n\n if (options.dryRun) {\n logger.info(chalk.yellow('\\n[DRY RUN] Would perform the following:'));\n if (backupPath) {\n logger.info(` - Backup existing: ${agent.config.targetDirectory}/ → ${agent.config.targetDirectory}.backup/`);\n }\n logger.info(` - Prepare directory: ${agent.config.targetDirectory}/`);\n logger.info(` - Download bundle: ${bundleInfo.filename}`);\n logger.info(` - Extract ${bundleInfo.fileCount} files`);\n return;\n }\n\n // 7. Backup existing directory if needed\n logger.divider();\n if (backupPath) {\n const backupSpinner = logger.spinner('Backing up existing content...');\n // Remove old backup if exists\n try {\n await fs.rm(backupPath, { recursive: true, force: true });\n } catch {\n // Ignore if doesn't exist\n }\n await fs.rename(targetDir, backupPath);\n backupSpinner.succeed(`Backed up to ${agent.config.targetDirectory}.backup/`);\n }\n\n // 8. Prepare target directory\n const prepareSpinner = logger.spinner('Preparing target directory...');\n await agent.prepare(projectPath);\n prepareSpinner.succeed('Target directory ready');\n\n // 9. Download and extract content\n const downloadSpinner = logger.spinner('Downloading content...');\n\n const result = await contentService.downloadAndExtractBundle(\n agent.config.id,\n userTier,\n targetDir,\n (progress) => {\n if (progress.phase === 'downloading') {\n downloadSpinner.text = `Downloading... ${progress.percentage}%`;\n } else if (progress.phase === 'extracting') {\n downloadSpinner.text = `Extracting ${progress.currentFile || ''}`;\n }\n }\n );\n\n if (result.success) {\n downloadSpinner.succeed(`Installed ${result.filesExtracted.length} files (v${result.version})`);\n\n // Save installation to config for upgrade tracking\n const config = new ConfigService();\n await config.addInstallation({\n path: projectPath,\n agent: agent.config.id,\n contentVersion: result.version,\n installedAt: new Date().toISOString(),\n files: result.filesExtracted,\n tier: userTier,\n checksum: bundleInfo.checksum,\n });\n\n // Update global content version\n const currentVersions = (await config.get('contentVersions')) ?? {};\n await config.set('contentVersions', {\n ...currentVersions,\n [agent.config.id]: result.version,\n });\n } else {\n downloadSpinner.fail('Installation failed');\n for (const error of result.errors) {\n logger.error(` ${error}`);\n }\n process.exit(1);\n }\n\n // 8. Final summary\n logger.divider();\n logger.success('JawKit content installed successfully!');\n logger.info(`\\nInstalled to: ${chalk.cyan(targetDir)}`);\n\n if (result.filesExtracted.length > 0) {\n logger.info('\\nFiles installed:');\n for (const file of result.filesExtracted.slice(0, 5)) {\n logger.info(chalk.dim(` ${file}`));\n }\n if (result.filesExtracted.length > 5) {\n logger.info(chalk.dim(` ... and ${result.filesExtracted.length - 5} more`));\n }\n }\n\n // Show promotional message for free tier users\n showPromoIfFree(userTier, logger);\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n}\n\n/**\n * Format bytes to human readable size\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport crypto from 'crypto';\nimport type {\n Agent,\n AgentConfig,\n ContentFile,\n InstallOptions,\n InstallResult,\n VerifyResult,\n CleanResult,\n} from './types.js';\n\n/**\n * Base class for agent adapters\n * Provides common functionality for file installation, detection, and management\n */\nexport abstract class BaseAgent implements Agent {\n abstract readonly config: AgentConfig;\n\n /**\n * Default detection based on markers\n */\n async detect(projectPath: string): Promise<boolean> {\n for (const marker of this.config.detection.markers) {\n const markerPath = path.join(projectPath, marker);\n try {\n await fs.access(markerPath);\n return true;\n } catch {\n // Marker not found, continue\n }\n }\n return false;\n }\n\n /**\n * Create target directory structure\n */\n async prepare(projectPath: string): Promise<void> {\n const targetDir = path.join(projectPath, this.config.targetDirectory);\n\n // Create main target directory\n await fs.mkdir(targetDir, { recursive: true });\n\n // Create subdirectories for each content type\n for (const contentType of this.config.supportedContentTypes) {\n const mapping = this.config.fileMappings.find(\n (m) => m.contentType === contentType\n );\n if (mapping && mapping.targetSubdir) {\n const subdir = path.join(targetDir, mapping.targetSubdir);\n await fs.mkdir(subdir, { recursive: true });\n }\n }\n }\n\n /**\n * Install content files\n */\n async install(\n projectPath: string,\n files: ContentFile[],\n options: InstallOptions\n ): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n errors: [],\n };\n\n for (const file of files) {\n // Filter by content type\n if (!options.contentTypes.includes(file.type)) {\n result.skipped.push({\n sourcePath: file.sourcePath,\n targetPath: this.getTargetPath(projectPath, file),\n reason: 'filtered',\n });\n continue;\n }\n\n const targetPath = this.getTargetPath(projectPath, file);\n\n try {\n // Check if file exists\n const exists = await this.fileExists(targetPath);\n\n if (exists && !options.force) {\n result.skipped.push({\n sourcePath: file.sourcePath,\n targetPath,\n reason: 'exists',\n });\n continue;\n }\n\n // Backup if needed\n if (exists && options.backup) {\n await this.backupFile(targetPath);\n }\n\n // Transform content if needed\n const content = this.transform(file.content, file);\n\n // Write file (unless dry run)\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, content, 'utf-8');\n }\n\n result.installed.push({\n sourcePath: file.sourcePath,\n targetPath,\n contentType: file.type,\n });\n } catch (error) {\n result.success = false;\n result.errors.push({\n sourcePath: file.sourcePath,\n targetPath,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return result;\n }\n\n /**\n * Verify installed files\n */\n async verify(projectPath: string): Promise<VerifyResult> {\n // Basic implementation - can be overridden in subclasses\n // Full implementation would track installed files and verify checksums\n const targetDir = path.join(projectPath, this.config.targetDirectory);\n\n try {\n await fs.access(targetDir);\n return {\n valid: true,\n verified: [targetDir],\n failed: [],\n };\n } catch {\n return {\n valid: false,\n verified: [],\n failed: [\n {\n path: targetDir,\n expected: 'exists',\n actual: 'missing',\n reason: 'missing',\n },\n ],\n };\n }\n }\n\n /**\n * Clean up installed files\n */\n async clean(_projectPath: string): Promise<CleanResult> {\n // Basic implementation - can be overridden in subclasses\n // Full implementation would track installed files and remove them\n return {\n success: true,\n removed: [],\n restored: [],\n };\n }\n\n /**\n * Get target path for a content file\n */\n getTargetPath(projectPath: string, file: ContentFile): string {\n const mapping = this.config.fileMappings.find(\n (m) => m.contentType === file.type\n );\n\n if (!mapping) {\n throw new Error(`No mapping found for content type: ${file.type}`);\n }\n\n const filename = path.basename(file.sourcePath);\n const targetFilename = mapping.nameTransform\n ? mapping.nameTransform(filename)\n : filename;\n\n return path.join(\n projectPath,\n this.config.targetDirectory,\n mapping.targetSubdir,\n targetFilename\n );\n }\n\n /**\n * Transform content before writing (override in subclasses if needed)\n */\n protected transform(content: string, _file: ContentFile): string {\n return content;\n }\n\n /**\n * Check if file exists\n */\n protected async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Backup a file before overwriting\n */\n protected async backupFile(filePath: string): Promise<void> {\n const backupPath = `${filePath}.jawkit-backup`;\n await fs.copyFile(filePath, backupPath);\n }\n\n /**\n * Calculate file checksum\n */\n protected calculateChecksum(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseAgent } from '../base-agent.js';\nimport type { AgentConfig } from '../types.js';\n\n/**\n * Claude Code agent adapter\n * Target directory: .claude/\n * Supports: commands, skills, agents\n */\nexport class ClaudeCodeAgent extends BaseAgent {\n readonly config: AgentConfig = {\n id: 'claude-code',\n name: 'Claude Code',\n description: 'Anthropic Claude Code AI assistant',\n targetDirectory: '.claude',\n supportedContentTypes: ['commands', 'skills', 'agents'],\n fileMappings: [\n {\n contentType: 'commands',\n sourcePattern: 'commands/**/*.md',\n targetSubdir: 'commands',\n },\n {\n contentType: 'skills',\n sourcePattern: 'skills/**/*.md',\n targetSubdir: 'skills',\n },\n {\n contentType: 'agents',\n sourcePattern: 'agents/**/*.md',\n targetSubdir: 'agents',\n },\n ],\n detection: {\n markers: [\n '.claude', // Existing Claude directory\n 'CLAUDE.md', // Claude project file\n '.claude.json', // Claude config\n ],\n priority: 100, // Highest priority - primary agent\n },\n docsUrl: 'https://docs.anthropic.com/claude-code',\n };\n\n /**\n * Enhanced detection: also detect any code project\n * Claude Code is our primary agent, so we suggest it for all code projects\n */\n async detect(projectPath: string): Promise<boolean> {\n // First check standard markers\n const hasMarkers = await super.detect(projectPath);\n if (hasMarkers) return true;\n\n // Always suggest Claude Code for any code project\n return this.isCodeProject(projectPath);\n }\n\n /**\n * Check if the directory appears to be a code project\n */\n private async isCodeProject(projectPath: string): Promise<boolean> {\n const codeMarkers = [\n // JavaScript/TypeScript\n 'package.json',\n 'tsconfig.json',\n // Rust\n 'Cargo.toml',\n // Python\n 'pyproject.toml',\n 'requirements.txt',\n 'setup.py',\n // Go\n 'go.mod',\n // Java/Kotlin\n 'pom.xml',\n 'build.gradle',\n 'build.gradle.kts',\n // Ruby\n 'Gemfile',\n // PHP\n 'composer.json',\n // .NET\n '*.csproj',\n '*.fsproj',\n // Git (any repo is likely code)\n '.git',\n ];\n\n for (const marker of codeMarkers) {\n if (marker.includes('*')) {\n // Handle glob patterns\n try {\n const files = await fs.readdir(projectPath);\n const pattern = marker.replace('*', '');\n if (files.some((f) => f.endsWith(pattern))) {\n return true;\n }\n } catch {\n // Continue\n }\n } else {\n try {\n await fs.access(path.join(projectPath, marker));\n return true;\n } catch {\n // Continue\n }\n }\n }\n\n return false;\n }\n}\n\n// Export singleton instance\nexport const claudeCodeAgent = new ClaudeCodeAgent();\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { BaseAgent } from '../base-agent.js';\nimport type { AgentConfig, ContentFile } from '../types.js';\n\n/**\n * GitHub Copilot agent adapter\n * Target directory: .github/\n * Supports: commands, skills\n */\nexport class GitHubCopilotAgent extends BaseAgent {\n readonly config: AgentConfig = {\n id: 'github-copilot',\n name: 'GitHub Copilot',\n description: 'GitHub Copilot AI assistant',\n targetDirectory: '.github',\n supportedContentTypes: ['commands', 'skills'],\n fileMappings: [\n {\n contentType: 'commands',\n sourcePattern: 'commands/**/*.md',\n targetSubdir: 'copilot/commands',\n },\n {\n contentType: 'skills',\n sourcePattern: 'skills/**/*.md',\n targetSubdir: 'copilot/skills',\n },\n ],\n detection: {\n markers: [\n '.github',\n '.github/copilot-instructions.md',\n ],\n priority: 50, // Lower priority than Claude Code\n },\n docsUrl: 'https://docs.github.com/copilot',\n };\n\n /**\n * Transform content for GitHub Copilot format if needed\n * Adds a title header if not present\n */\n protected transform(content: string, file: ContentFile): string {\n // Add Copilot-specific header if not present\n if (!content.startsWith('# ')) {\n const filename = path.basename(file.sourcePath, '.md');\n const title = filename\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n return `# ${title}\\n\\n${content}`;\n }\n\n return content;\n }\n\n /**\n * GitHub Copilot specific: also create main instructions file\n */\n async prepare(projectPath: string): Promise<void> {\n await super.prepare(projectPath);\n\n // Create copilot-instructions.md if it doesn't exist\n const instructionsPath = path.join(\n projectPath,\n '.github',\n 'copilot-instructions.md'\n );\n\n try {\n await fs.access(instructionsPath);\n } catch {\n // Create default instructions file\n const defaultContent = `# GitHub Copilot Instructions\n\nThis file configures GitHub Copilot behavior for this project.\n\n## Custom Commands\n\nSee the \\`copilot/commands/\\` directory for available commands.\n\n## Skills\n\nSee the \\`copilot/skills/\\` directory for available skills.\n\n---\n\n*Managed by JawKit CLI*\n`;\n await fs.writeFile(instructionsPath, defaultContent, 'utf-8');\n }\n }\n}\n\n// Export singleton instance\nexport const gitHubCopilotAgent = new GitHubCopilotAgent();\n","import type { Agent } from './types.js';\nimport { claudeCodeAgent } from './claude-code/index.js';\nimport { gitHubCopilotAgent } from './github-copilot/index.js';\n\n/**\n * Registry for agent adapters\n * Manages registration, lookup, and detection of agents\n */\nexport class AgentRegistry {\n private agents: Map<string, Agent> = new Map();\n\n constructor() {\n // Register built-in agents\n this.register(claudeCodeAgent);\n this.register(gitHubCopilotAgent);\n }\n\n /**\n * Register an agent adapter\n */\n register(agent: Agent): void {\n if (this.agents.has(agent.config.id)) {\n throw new Error(`Agent already registered: ${agent.config.id}`);\n }\n this.agents.set(agent.config.id, agent);\n }\n\n /**\n * Get agent by ID\n */\n get(id: string): Agent | undefined {\n return this.agents.get(id);\n }\n\n /**\n * Get all registered agents\n */\n getAll(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Get all agent IDs\n */\n getIds(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Detect applicable agents for a project\n * Returns agents sorted by priority (highest first)\n */\n async detectAgents(projectPath: string): Promise<Agent[]> {\n const detected: Agent[] = [];\n\n for (const agent of this.agents.values()) {\n if (await agent.detect(projectPath)) {\n detected.push(agent);\n }\n }\n\n // Sort by priority (higher first)\n return detected.sort(\n (a, b) => b.config.detection.priority - a.config.detection.priority\n );\n }\n\n /**\n * Check if an agent ID is valid\n */\n isValidAgent(id: string): boolean {\n return this.agents.has(id);\n }\n\n /**\n * Get agent count\n */\n get size(): number {\n return this.agents.size;\n }\n}\n\n// Export singleton instance\nexport const agentRegistry = new AgentRegistry();\n","/**\n * Promotional messages for upselling Professional tier\n */\n\nimport chalk from 'chalk';\n\nconst PROMO_URL = 'https://jawkit.cc/pro';\n\n/**\n * Get promotional message for free tier users\n */\nexport function getPromoMessage(): string[] {\n return [\n '',\n chalk.dim('─'.repeat(60)),\n `${chalk.yellow('💎')} ${chalk.bold('Professional')}: Advanced skills + priority support`,\n chalk.dim(` ${PROMO_URL}`),\n chalk.dim('─'.repeat(60)),\n ];\n}\n\n/**\n * Get short promotional tip\n */\nexport function getPromoTip(): string {\n return chalk.dim(`💎 Upgrade to Professional for 50+ advanced skills → ${PROMO_URL}`);\n}\n\n/**\n * Show promotional message if user is on free tier\n */\nexport function showPromoIfFree(\n tier: string,\n logger: { info: (msg: string) => void }\n): void {\n if (tier === 'free') {\n for (const line of getPromoMessage()) {\n logger.info(line);\n }\n }\n}\n","import { Command } from 'commander';\nimport { confirm, input } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { Logger } from '../lib/logger.js';\nimport { handleError } from '../lib/errors.js';\nimport { getAuthService, getTierDisplayName } from '../auth/index.js';\n\n// Email validation regex - standard format check\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction isValidEmail(email: string): boolean {\n return EMAIL_REGEX.test(email);\n}\n\nexport function authCommand(): Command {\n const auth = new Command('auth')\n .description('Manage license key authentication');\n\n auth\n .command('activate <license-key>')\n .description('Activate a license key')\n .action(async (licenseKey: string, options) => {\n const logger = new Logger(options);\n const authService = getAuthService();\n\n try {\n // Check if already authenticated\n const isAuthenticated = await authService.isAuthenticated();\n if (isAuthenticated) {\n const user = await authService.getCurrentUser();\n if (user) {\n logger.info(`You already have an active license for ${chalk.cyan(user.email)} (${getTierDisplayName(user.tier)})`);\n logger.divider();\n\n const continueActivation = await confirm({\n message: 'Replace with new license key?',\n default: false,\n });\n\n if (!continueActivation) {\n return;\n }\n }\n }\n\n const spinner = logger.spinner('Validating license key...');\n\n const result = await authService.activate(licenseKey);\n\n if (result.success && result.user) {\n spinner.succeed('License activated!');\n logger.divider();\n logger.info(`${chalk.green('Email:')} ${result.user.email}`);\n logger.info(`${chalk.green('Tier:')} ${getTierDisplayName(result.user.tier)}`);\n if (result.user.tierExpiresAt) {\n const expiresDate = new Date(result.user.tierExpiresAt);\n logger.info(`${chalk.green('Expires:')} ${expiresDate.toLocaleDateString()}`);\n } else {\n logger.info(`${chalk.green('Expires:')} Never (Lifetime)`);\n }\n logger.divider();\n logger.info('You now have access to Professional content!');\n } else {\n spinner.fail('License activation failed');\n if (result.error) {\n logger.error(result.error);\n }\n process.exit(1);\n }\n\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n\n auth\n .command('redeem [invite-code]')\n .description('Redeem an invitation code to get a license')\n .option('-e, --email <email>', 'Email address for the license')\n .action(async (inviteCode: string | undefined, options) => {\n const logger = new Logger(options);\n const authService = getAuthService();\n\n try {\n // Check if already authenticated\n const isAuthenticated = await authService.isAuthenticated();\n if (isAuthenticated) {\n const user = await authService.getCurrentUser();\n if (user) {\n logger.info(`You already have an active license for ${chalk.cyan(user.email)} (${getTierDisplayName(user.tier)})`);\n logger.divider();\n\n const continueRedeem = await confirm({\n message: 'Replace with new license from invitation?',\n default: false,\n });\n\n if (!continueRedeem) {\n return;\n }\n }\n }\n\n // Get invite code if not provided\n let code = inviteCode;\n if (!code) {\n code = await input({\n message: 'Enter invitation code:',\n validate: (value) => {\n if (!value.startsWith('JAWKIT_INV_')) {\n return 'Invitation codes start with JAWKIT_INV_';\n }\n return true;\n },\n });\n }\n\n // Get email if not provided\n let email = options.email;\n if (!email) {\n email = await input({\n message: 'Enter your email address:',\n validate: (value) => {\n if (!isValidEmail(value)) {\n return 'Please enter a valid email address (e.g., user@example.com)';\n }\n return true;\n },\n });\n } else {\n // Validate email from --email flag\n if (!isValidEmail(email)) {\n logger.error('Invalid email format. Please provide a valid email address (e.g., user@example.com)');\n process.exit(1);\n }\n }\n\n const spinner = logger.spinner('Redeeming invitation...');\n\n const result = await authService.redeem(code, email);\n\n if (result.success && result.user) {\n spinner.succeed('Invitation redeemed!');\n logger.divider();\n logger.info(`${chalk.green('Email:')} ${result.user.email}`);\n logger.info(`${chalk.green('Tier:')} ${getTierDisplayName(result.user.tier)}`);\n if (result.user.tierExpiresAt) {\n const expiresDate = new Date(result.user.tierExpiresAt);\n logger.info(`${chalk.green('Expires:')} ${expiresDate.toLocaleDateString()}`);\n } else {\n logger.info(`${chalk.green('Expires:')} Never (Lifetime)`);\n }\n logger.divider();\n logger.info('Your license has been activated!');\n } else {\n spinner.fail('Redemption failed');\n if (result.error) {\n logger.error(result.error);\n }\n process.exit(1);\n }\n\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n\n auth\n .command('deactivate')\n .description('Remove stored license key')\n .action(async (options) => {\n const logger = new Logger(options);\n const authService = getAuthService();\n\n try {\n const isAuthenticated = await authService.isAuthenticated();\n\n if (!isAuthenticated) {\n logger.info('No license key is currently stored');\n return;\n }\n\n const user = await authService.getCurrentUser();\n const proceed = await confirm({\n message: `Remove license for ${user?.email}?`,\n default: false,\n });\n\n if (!proceed) {\n return;\n }\n\n await authService.deactivate();\n logger.success('License key removed');\n logger.info(chalk.dim('Free tier content is still accessible.'));\n\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n\n auth\n .command('status')\n .description('Show current license status')\n .option('--json', 'Output as JSON')\n .option('--revalidate', 'Revalidate license with server')\n .action(async (options) => {\n const logger = new Logger(options);\n const authService = getAuthService();\n\n try {\n // Revalidate if requested\n if (options.revalidate) {\n const spinner = logger.spinner('Revalidating license...');\n const result = await authService.revalidate();\n if (result.success) {\n spinner.succeed('License revalidated');\n } else {\n spinner.fail('Revalidation failed');\n if (result.error) {\n logger.error(result.error);\n }\n }\n logger.divider();\n }\n\n const isAuthenticated = await authService.isAuthenticated();\n const user = isAuthenticated ? await authService.getCurrentUser() : null;\n\n if (options.json) {\n logger.json({\n authenticated: isAuthenticated,\n user: user ? {\n email: user.email,\n tier: user.tier,\n tierDisplayName: getTierDisplayName(user.tier),\n tierExpiresAt: user.tierExpiresAt,\n } : null,\n });\n return;\n }\n\n logger.info('License Status');\n logger.divider();\n\n if (!isAuthenticated || !user) {\n logger.info(`${chalk.yellow('Status:')} No license activated`);\n logger.divider();\n logger.info(\"Run 'jawkit auth activate <key>' or 'jawkit auth redeem' for Professional.\");\n logger.info('Free tier content is available without a license.');\n logger.info(`Purchase at ${chalk.cyan('https://jawkit.cc/pro')}`);\n return;\n }\n\n logger.info(`${chalk.green('Status:')} Licensed ${chalk.green('✓')}`);\n logger.info(`${chalk.green('Email:')} ${user.email}`);\n logger.info(`${chalk.green('Tier:')} ${getTierDisplayName(user.tier)}`);\n\n if (user.tierExpiresAt) {\n const expiresDate = new Date(user.tierExpiresAt);\n const now = new Date();\n const daysUntilExpiry = Math.ceil((expiresDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n\n if (daysUntilExpiry < 0) {\n logger.info(`${chalk.red('Expired:')} ${expiresDate.toLocaleDateString()} (fallen back to Free tier)`);\n } else if (daysUntilExpiry <= 7) {\n logger.info(`${chalk.yellow('Expires:')} ${expiresDate.toLocaleDateString()} (${daysUntilExpiry} days)`);\n } else {\n logger.info(`${chalk.green('Expires:')} ${expiresDate.toLocaleDateString()}`);\n }\n } else {\n logger.info(`${chalk.green('Expires:')} Never (Lifetime)`);\n }\n\n\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n\n return auth;\n}\n","import { Command } from 'commander';\nimport { Logger } from '../lib/logger.js';\nimport { handleError } from '../lib/errors.js';\nimport { ConfigService } from '../lib/config.js';\nimport {\n getCliVersion,\n checkCliUpdate,\n isNewerVersion,\n} from '../services/cli-version.js';\nimport { checkContentUpdates } from '../services/content-version.js';\n\nexport function versionCommand(): Command {\n return new Command('version')\n .description('Show CLI and content version information')\n .option('--check', 'Check for available updates')\n .option('--json', 'Output as JSON format')\n .action(async (options) => {\n const logger = new Logger(options);\n const config = new ConfigService();\n\n try {\n const cliVersion = getCliVersion();\n const contentVersions =\n (await config.get('contentVersions')) ?? {};\n\n let cliLatest: string | null = null;\n let contentUpdates: Record<string, string> = {};\n\n // Check for updates if requested\n if (options.check) {\n const spinner = logger.spinner('Checking for updates...');\n spinner.start();\n\n cliLatest = await checkCliUpdate();\n contentUpdates = await checkContentUpdates(contentVersions);\n\n spinner.stop();\n }\n\n if (options.json) {\n const output = {\n cli: {\n current: cliVersion,\n latest: cliLatest ?? cliVersion,\n updateAvailable: cliLatest\n ? isNewerVersion(cliLatest, cliVersion)\n : false,\n },\n content: Object.fromEntries(\n Object.entries(contentVersions).map(([agent, version]) => [\n agent,\n {\n current: version,\n latest: contentUpdates[agent] ?? version,\n updateAvailable: Boolean(contentUpdates[agent]),\n },\n ])\n ),\n };\n\n logger.json(output);\n } else {\n // CLI version line\n let cliLine = `@jawkit/cli v${cliVersion}`;\n if (cliLatest && isNewerVersion(cliLatest, cliVersion)) {\n cliLine += ` (latest: v${cliLatest} available)`;\n logger.info(cliLine);\n logger.info(' Run: npm update -g @jawkit/cli');\n } else if (options.check) {\n cliLine += ' (up to date)';\n logger.info(cliLine);\n } else {\n logger.info(cliLine);\n }\n\n logger.newline();\n\n // Content versions\n if (Object.keys(contentVersions).length > 0) {\n logger.info('Content Versions:');\n for (const [agent, version] of Object.entries(contentVersions)) {\n const latestVersion = contentUpdates[agent];\n let line = ` ${agent.padEnd(18)} v${version}`;\n\n if (latestVersion) {\n line += ` (latest: v${latestVersion} available)`;\n } else if (options.check) {\n line += ' (up to date)';\n }\n\n logger.info(line);\n }\n\n // Show upgrade hint if updates available\n if (Object.keys(contentUpdates).length > 0) {\n logger.newline();\n logger.info(\"Run 'jawkit upgrade' to update content.\");\n }\n } else {\n logger.info('No content installed yet.');\n logger.info(\"Run 'jawkit init' to install content.\");\n }\n }\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { Logger } from '../lib/logger.js';\nimport { handleError } from '../lib/errors.js';\nimport { ConfigService, Installation } from '../lib/config.js';\nimport { getContentService } from '../content/content.service.js';\nimport { getAuthService } from '../auth/auth.service.js';\nimport { agentRegistry } from '../agents/registry.js';\nimport { getCliVersion, isNewerVersion } from '../services/cli-version.js';\nimport type { TierLevel } from '../auth/types.js';\nimport { showPromoIfFree } from '../lib/promo.js';\n\ninterface InstallUpdate {\n install: Installation;\n agentId: string;\n currentVersion: string;\n latestVersion: string;\n latestChecksum: string;\n changelog: string;\n reason: 'version' | 'tier' | 'checksum' | 'force';\n tierChange?: { from: string; to: string };\n}\n\nexport function upgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade content in current folder (use --all for all projects)')\n .option('-a, --agent <agent>', 'Upgrade specific agent only')\n .option('--all', 'Upgrade all registered projects')\n .option('-y, --yes', 'Skip confirmation prompts')\n .option('--check-only', 'Only check for updates, do not upgrade')\n .option('--force', 'Force re-download even if up to date')\n .action(async (options) => {\n const logger = new Logger(options);\n const config = new ConfigService();\n const contentService = getContentService();\n const authService = getAuthService();\n const projectPath = process.cwd();\n\n try {\n // Get all installations\n const allInstallations = await config.getInstallations();\n\n // Determine which installations to check\n let targetInstalls: Installation[];\n\n if (options.all) {\n // All registered projects\n targetInstalls = allInstallations;\n } else {\n // Current folder only\n const currentInstall = allInstallations.find(\n (i) => i.path === projectPath\n );\n\n if (!currentInstall) {\n logger.warn('No JawKit installation found in current folder.');\n logger.info(`Current folder: ${projectPath}`);\n logger.newline();\n logger.info(\"Run 'jawkit init' to install content first.\");\n logger.info(\"Or use 'jawkit upgrade --all' to upgrade all registered projects.\");\n return;\n }\n\n // Verify target directory still exists\n const agent = agentRegistry.get(currentInstall.agent);\n if (agent) {\n const targetDir = path.join(projectPath, agent.config.targetDirectory);\n try {\n await fs.access(targetDir);\n } catch {\n logger.warn('Content directory not found (may have been deleted).');\n logger.info(`Expected: ${targetDir}`);\n logger.newline();\n logger.info(\"Run 'jawkit init' to reinstall content.\");\n return;\n }\n }\n\n targetInstalls = [currentInstall];\n }\n\n if (targetInstalls.length === 0) {\n logger.warn('No registered installations found.');\n logger.info(\"Run 'jawkit init' in a project to install content first.\");\n return;\n }\n\n // Show current versions\n const cliVersion = getCliVersion();\n logger.info(`CLI: @jawkit/cli v${cliVersion}`);\n\n // Show versions for target installations\n for (const install of targetInstalls) {\n const displayPath = options.all ? ` (${install.path})` : '';\n logger.info(`Content: ${install.agent} v${install.contentVersion}${displayPath}`);\n }\n logger.newline();\n\n // Check for updates\n const spinner = logger.spinner('Checking for updates...');\n spinner.start();\n\n const manifest = await contentService.getManifest('latest');\n\n // Get user's current tier\n const currentTier = await authService.getUserTier();\n\n // Find updates for each installation individually\n const installUpdates: InstallUpdate[] = [];\n\n for (const install of targetInstalls) {\n const agentId = install.agent;\n\n // Filter by --agent option if specified\n if (options.agent && agentId !== options.agent) continue;\n\n const agentManifest = manifest.agents[agentId];\n const latest = agentManifest?.version;\n const current = install.contentVersion;\n const installedTier = install.tier || 'free';\n\n if (!latest) continue;\n\n // Get bundle checksum from manifest for current tier\n const bundleInfo = agentManifest.bundles[currentTier] || agentManifest.bundles['free'];\n const latestChecksum = bundleInfo?.checksum || '';\n const installedChecksum = install.checksum;\n\n // Check for version update, tier upgrade, or checksum change\n const hasVersionUpdate = !current || isNewerVersion(latest, current);\n const hasTierChange = installedTier !== currentTier;\n const hasChecksumChange = latestChecksum && installedChecksum && latestChecksum !== installedChecksum;\n // No stored checksum means old installation - needs update\n const needsChecksumUpdate = latestChecksum && !installedChecksum;\n\n let reason: InstallUpdate['reason'] | null = null;\n if (options.force) reason = 'force';\n else if (hasVersionUpdate) reason = 'version';\n else if (hasTierChange) reason = 'tier';\n else if (hasChecksumChange || needsChecksumUpdate) reason = 'checksum';\n\n if (reason) {\n installUpdates.push({\n install,\n agentId,\n currentVersion: current || 'not installed',\n latestVersion: latest,\n latestChecksum,\n changelog: manifest.changelog,\n reason,\n tierChange: hasTierChange ? { from: installedTier, to: currentTier } : undefined,\n });\n }\n }\n\n spinner.stop();\n\n // No updates\n if (installUpdates.length === 0) {\n logger.success('All content is up to date!');\n return;\n }\n\n // Group updates by agent for display\n const agentGroups = new Map<string, InstallUpdate[]>();\n for (const update of installUpdates) {\n const existing = agentGroups.get(update.agentId) || [];\n existing.push(update);\n agentGroups.set(update.agentId, existing);\n }\n\n // Display updates\n logger.info('Updates Available:');\n logger.divider();\n\n for (const [agentId, updates] of agentGroups) {\n const first = updates[0]!;\n if (first.tierChange) {\n logger.info(\n `${agentId}: ${first.tierChange.from} → ${first.tierChange.to} tier`\n );\n } else if (first.reason === 'checksum') {\n logger.info(\n `${agentId}: v${first.currentVersion} (content updated)`\n );\n } else if (first.reason === 'force') {\n logger.info(\n `${agentId}: v${first.currentVersion} (forced)`\n );\n } else {\n logger.info(\n `${agentId}: v${first.currentVersion} → v${first.latestVersion}`\n );\n }\n if (first.changelog && first.reason === 'version') {\n logger.info(' Changelog:');\n const lines = first.changelog.split('\\n').slice(0, 5);\n for (const line of lines) {\n if (line.trim()) {\n logger.info(` ${line}`);\n }\n }\n }\n }\n\n // Show affected projects\n logger.newline();\n logger.info(`${installUpdates.length} project(s) to update:`);\n for (const update of installUpdates) {\n logger.info(` - ${update.install.path}`);\n }\n\n // Check only mode\n if (options.checkOnly) {\n logger.newline();\n logger.info(\"Run 'jawkit upgrade' to apply updates.\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n const proceed = await confirm({\n message: 'Apply updates?',\n default: true,\n });\n\n if (!proceed) {\n logger.info('Upgrade cancelled.');\n return;\n }\n }\n\n // Get user's tier\n const tier = await authService.getUserTier();\n\n // Get current global versions for updating\n const currentVersions = (await config.get('contentVersions')) ?? {};\n\n // Perform upgrade for each agent group\n for (const [agentId, updates] of agentGroups) {\n logger.newline();\n const agentSpinner = logger.spinner(\n `Updating ${agentId} content...`\n );\n agentSpinner.start();\n\n const agent = agentRegistry.get(agentId);\n if (!agent) {\n agentSpinner.fail(`Agent not found: ${agentId}`);\n continue;\n }\n\n let totalUpdated = 0;\n\n for (const update of updates) {\n try {\n // Download and extract to target directory\n const targetDir = `${update.install.path}/${agent.config.targetDirectory}`;\n const result = await contentService.downloadAndExtractBundle(\n agentId,\n tier as TierLevel,\n targetDir,\n (progress) => {\n if (progress.phase === 'downloading') {\n agentSpinner.text = `Downloading ${agentId}: ${progress.percentage}%`;\n } else {\n agentSpinner.text = `Extracting ${agentId}: ${progress.currentFile || ''}`;\n }\n }\n );\n\n // Update installation record with new checksum\n await config.updateInstallation(update.install.path, {\n contentVersion: update.latestVersion,\n installedAt: new Date().toISOString(),\n files: result.filesExtracted,\n tier: tier,\n checksum: update.latestChecksum,\n });\n\n totalUpdated++;\n } catch (err) {\n logger.error(\n `Failed to update ${update.install.path}: ${err instanceof Error ? err.message : 'Unknown error'}`\n );\n }\n }\n\n // Update global version\n const latestVersion = updates[0]!.latestVersion;\n await config.set('contentVersions', {\n ...currentVersions,\n [agentId]: latestVersion,\n });\n\n agentSpinner.succeed(\n `Updated ${totalUpdated} project(s) to ${agentId} v${latestVersion}`\n );\n }\n\n logger.newline();\n logger.success('Upgrade complete!');\n\n // Show promotional message for free tier users\n showPromoIfFree(tier, logger);\n } catch (error) {\n handleError(error, logger);\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["Command","chalk","fs","path","fs","path","fs","path","fs","path","path","fs","chalk","path","fs","Command","confirm","chalk","Command","chalk","confirm","Command","Command","version","Command","confirm","fs","path","Command","path","fs","confirm","Command"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Ora } from 'ora';
|
|
2
|
+
|
|
3
|
+
interface JawKitConfig {
|
|
4
|
+
contentVersions?: Record<string, string>;
|
|
5
|
+
lastUpdateCheck?: string;
|
|
6
|
+
installations?: Installation[];
|
|
7
|
+
}
|
|
8
|
+
interface Installation {
|
|
9
|
+
path: string;
|
|
10
|
+
agent: string;
|
|
11
|
+
contentVersion: string;
|
|
12
|
+
installedAt: string;
|
|
13
|
+
files: string[];
|
|
14
|
+
tier?: string;
|
|
15
|
+
checksum?: string;
|
|
16
|
+
}
|
|
17
|
+
declare class ConfigService {
|
|
18
|
+
private configDir;
|
|
19
|
+
private configPath;
|
|
20
|
+
private config;
|
|
21
|
+
constructor(configDir?: string);
|
|
22
|
+
initialize(): Promise<void>;
|
|
23
|
+
load(): Promise<JawKitConfig>;
|
|
24
|
+
save(): Promise<void>;
|
|
25
|
+
get<K extends keyof JawKitConfig>(key: K): Promise<JawKitConfig[K]>;
|
|
26
|
+
set<K extends keyof JawKitConfig>(key: K, value: JawKitConfig[K]): Promise<void>;
|
|
27
|
+
getInstallations(): Promise<Installation[]>;
|
|
28
|
+
addInstallation(installation: Installation): Promise<void>;
|
|
29
|
+
updateInstallation(installPath: string, updates: Partial<Installation>): Promise<void>;
|
|
30
|
+
getConfigDir(): string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface LoggerOptions {
|
|
34
|
+
quiet?: boolean;
|
|
35
|
+
verbose?: boolean;
|
|
36
|
+
json?: boolean;
|
|
37
|
+
}
|
|
38
|
+
declare class Logger {
|
|
39
|
+
private options;
|
|
40
|
+
private currentSpinner;
|
|
41
|
+
constructor(options?: LoggerOptions);
|
|
42
|
+
info(message: string): void;
|
|
43
|
+
success(message: string): void;
|
|
44
|
+
warn(message: string): void;
|
|
45
|
+
error(message: string): void;
|
|
46
|
+
debug(message: string): void;
|
|
47
|
+
newline(): void;
|
|
48
|
+
divider(char?: string, length?: number): void;
|
|
49
|
+
spinner(text: string): Ora;
|
|
50
|
+
stopSpinner(): void;
|
|
51
|
+
progress(percentage: number, text?: string): void;
|
|
52
|
+
table(data: Record<string, string>[]): void;
|
|
53
|
+
json(data: unknown): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
declare abstract class JawKitError extends Error {
|
|
57
|
+
abstract code: string;
|
|
58
|
+
suggestion?: string;
|
|
59
|
+
cause?: Error;
|
|
60
|
+
constructor(message: string, options?: {
|
|
61
|
+
cause?: Error;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
declare class AuthError extends JawKitError {
|
|
65
|
+
code: string;
|
|
66
|
+
static notAuthenticated(): AuthError;
|
|
67
|
+
static licenseExpired(): AuthError;
|
|
68
|
+
static activationFailed(reason?: string): AuthError;
|
|
69
|
+
static licenseRevoked(): AuthError;
|
|
70
|
+
static licenseNotFound(): AuthError;
|
|
71
|
+
}
|
|
72
|
+
declare class ContentError extends JawKitError {
|
|
73
|
+
code: string;
|
|
74
|
+
static manifestNotFound(): ContentError;
|
|
75
|
+
static checksumMismatch(bundle: string): ContentError;
|
|
76
|
+
static downloadFailed(bundle: string, status?: number): ContentError;
|
|
77
|
+
static extractionFailed(bundle: string): ContentError;
|
|
78
|
+
static tierAccessDenied(tier: string): ContentError;
|
|
79
|
+
static signedUrlFailed(): ContentError;
|
|
80
|
+
}
|
|
81
|
+
declare class AgentError extends JawKitError {
|
|
82
|
+
code: string;
|
|
83
|
+
static notFound(agentId: string): AgentError;
|
|
84
|
+
static installFailed(agentId: string, reason?: string): AgentError;
|
|
85
|
+
static alreadyInstalled(agentId: string, path: string): AgentError;
|
|
86
|
+
}
|
|
87
|
+
declare class ConfigError extends JawKitError {
|
|
88
|
+
code: string;
|
|
89
|
+
static readFailed(path: string): ConfigError;
|
|
90
|
+
static writeFailed(path: string): ConfigError;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle and display error to user
|
|
94
|
+
*/
|
|
95
|
+
declare function handleError(error: unknown, logger: Logger): void;
|
|
96
|
+
|
|
97
|
+
export { AgentError, AuthError, ConfigError, ConfigService, ContentError, type Installation, type JawKitConfig, JawKitError, Logger, type LoggerOptions, handleError };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
AgentError,
|
|
4
|
+
AuthError,
|
|
5
|
+
ConfigError,
|
|
6
|
+
ConfigService,
|
|
7
|
+
ContentError,
|
|
8
|
+
JawKitError,
|
|
9
|
+
Logger,
|
|
10
|
+
handleError
|
|
11
|
+
} from "./chunk-V3HNAAHL.js";
|
|
12
|
+
|
|
13
|
+
// src/lib/update-checker.ts
|
|
14
|
+
var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
15
|
+
export {
|
|
16
|
+
AgentError,
|
|
17
|
+
AuthError,
|
|
18
|
+
ConfigError,
|
|
19
|
+
ConfigService,
|
|
20
|
+
ContentError,
|
|
21
|
+
JawKitError,
|
|
22
|
+
Logger,
|
|
23
|
+
handleError
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/update-checker.ts"],"sourcesContent":["import { ConfigService } from './config.js';\nimport { Logger } from './logger.js';\nimport {\n checkCliUpdate,\n getCliVersion,\n isNewerVersion,\n} from '../services/cli-version.js';\nimport {\n getContentVersions,\n checkContentUpdates,\n} from '../services/content-version.js';\n\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\n/**\n * Check for updates in background (non-blocking)\n * This should be called from CLI commands to notify users of available updates\n */\nexport async function backgroundUpdateCheck(logger: Logger): Promise<void> {\n const config = new ConfigService();\n\n // Check if we should run (rate limit)\n const lastCheck = await config.get('lastUpdateCheck');\n if (lastCheck) {\n const lastCheckTime = new Date(lastCheck).getTime();\n if (Date.now() - lastCheckTime < CHECK_INTERVAL_MS) {\n return;\n }\n }\n\n // Update last check time\n await config.set('lastUpdateCheck', new Date().toISOString());\n\n // Run checks in background (don't await in main flow)\n setImmediate(async () => {\n try {\n let hasUpdates = false;\n\n // Check CLI version\n const cliLatest = await checkCliUpdate();\n const cliCurrent = getCliVersion();\n\n if (cliLatest && isNewerVersion(cliLatest, cliCurrent)) {\n logger.newline();\n logger.warn(\n `Update available: @jawkit/cli v${cliCurrent} → v${cliLatest}`\n );\n logger.info(' Run: npm update -g @jawkit/cli');\n hasUpdates = true;\n }\n\n // Check content versions\n const contentVersions = await getContentVersions();\n const contentUpdates = await checkContentUpdates(contentVersions);\n\n if (Object.keys(contentUpdates).length > 0) {\n if (!hasUpdates) {\n logger.newline();\n }\n logger.warn('Content updates available');\n logger.info(\" Run: jawkit upgrade\");\n }\n } catch {\n // Silently ignore errors in background check\n }\n });\n}\n\n/**\n * Check for updates synchronously and return the results\n * Use this when you need the update info immediately\n */\nexport async function checkForUpdates(): Promise<UpdateCheckResult> {\n const result: UpdateCheckResult = {\n cli: null,\n content: {},\n };\n\n try {\n // Check CLI version\n const cliLatest = await checkCliUpdate();\n const cliCurrent = getCliVersion();\n\n if (cliLatest && isNewerVersion(cliLatest, cliCurrent)) {\n result.cli = {\n current: cliCurrent,\n latest: cliLatest,\n };\n }\n\n // Check content versions\n const contentVersions = await getContentVersions();\n result.content = await checkContentUpdates(contentVersions);\n } catch {\n // Silently ignore errors\n }\n\n return result;\n}\n\nexport interface UpdateCheckResult {\n cli: { current: string; latest: string } | null;\n content: Record<string, string>; // agentId -> latest version\n}\n\n/**\n * Check if any updates are available\n */\nexport function hasAnyUpdates(result: UpdateCheckResult): boolean {\n return result.cli !== null || Object.keys(result.content).length > 0;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAM,oBAAoB,KAAK,KAAK,KAAK;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jawkit.cc/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI toolkit for installing AI coding assistant configurations",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"jawkit": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"content"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"start": "node dist/cli.js",
|
|
25
|
+
"lint": "eslint src --ext .ts",
|
|
26
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"test:run": "vitest run",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"bundle-content": "tsx scripts/bundle-content.ts",
|
|
31
|
+
"upload-content": "node scripts/upload-content.js",
|
|
32
|
+
"deploy": "node scripts/deploy.js",
|
|
33
|
+
"publish-content": "npm run bundle-content && npm run upload-content",
|
|
34
|
+
"serve:local": "tsx scripts/local-r2-server.ts",
|
|
35
|
+
"prebuild": "npm run bundle-content || true",
|
|
36
|
+
"prepublishOnly": "npm run build"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"cli",
|
|
40
|
+
"ai",
|
|
41
|
+
"claude",
|
|
42
|
+
"copilot",
|
|
43
|
+
"coding-assistant",
|
|
44
|
+
"developer-tools"
|
|
45
|
+
],
|
|
46
|
+
"author": "JawKit",
|
|
47
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
48
|
+
"private": false,
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18.0.0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@inquirer/prompts": "^7.2.1",
|
|
54
|
+
"chalk": "^5.4.1",
|
|
55
|
+
"commander": "^13.0.0",
|
|
56
|
+
"ofetch": "^1.4.1",
|
|
57
|
+
"ora": "^8.1.1",
|
|
58
|
+
"tar": "^7.4.3"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^22.10.7",
|
|
62
|
+
"eslint": "^9.18.0",
|
|
63
|
+
"tsup": "^8.3.5",
|
|
64
|
+
"tsx": "^4.7.0",
|
|
65
|
+
"typescript": "^5.7.3",
|
|
66
|
+
"vitest": "^2.1.8"
|
|
67
|
+
}
|
|
68
|
+
}
|