UNPKG

aico-pack

Version:

A tool to pack repository contents to single file for AI consumption

93 lines โ€ข 5.37 kB
import path from 'node:path'; import pc from 'picocolors'; import { logger } from '../shared/logger.js'; export const printSummary = (packResult, config) => { var _a; let securityCheckMessage = ''; if (config.security.enableSecurityCheck) { if (packResult.suspiciousFilesResults.length > 0) { securityCheckMessage = pc.yellow(`${packResult.suspiciousFilesResults.length.toLocaleString()} suspicious file(s) detected and excluded`); } else { securityCheckMessage = pc.white('โœ” No suspicious files detected'); } } else { securityCheckMessage = pc.dim('Security check disabled'); } logger.log(pc.white('๐Ÿ“Š Pack Summary:')); logger.log(pc.dim('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€')); logger.log(`${pc.white(' Total Files:')} ${pc.white(packResult.totalFiles.toLocaleString())} files`); logger.log(`${pc.white(' Total Tokens:')} ${pc.white(packResult.totalTokens.toLocaleString())} tokens`); logger.log(`${pc.white(' Total Chars:')} ${pc.white(packResult.totalCharacters.toLocaleString())} chars`); logger.log(`${pc.white(' Output:')} ${pc.white(config.output.filePath)}`); logger.log(`${pc.white(' Security:')} ${pc.white(securityCheckMessage)}`); if ((_a = config.output.git) === null || _a === void 0 ? void 0 : _a.includeDiffs) { let gitDiffsMessage = ''; if (packResult.gitDiffTokenCount) { gitDiffsMessage = pc.white(`โœ” Git diffs included ${pc.dim(`(${packResult.gitDiffTokenCount.toLocaleString()} tokens)`)}`); } else { gitDiffsMessage = pc.dim('โœ– No git diffs included'); } logger.log(`${pc.white(' Git Diffs:')} ${gitDiffsMessage}`); } }; export const printSecurityCheck = (rootDir, suspiciousFilesResults, suspiciousGitDiffResults, config) => { if (!config.security.enableSecurityCheck) { return; } logger.log(pc.white('๐Ÿ”Ž ๅฎ‰ๅ…จๆฃ€ๆŸฅ:')); logger.log(pc.dim('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€')); // Print results for files if (suspiciousFilesResults.length === 0) { logger.log(`${pc.green('โœ”')} ${pc.white('No suspicious files detected.')}`); } else { logger.log(pc.yellow(`${suspiciousFilesResults.length} suspicious file(s) detected and excluded from the output:`)); suspiciousFilesResults.forEach((suspiciousFilesResult, index) => { const relativeFilePath = path.relative(rootDir, suspiciousFilesResult.filePath); logger.log(`${pc.white(`${index + 1}.`)} ${pc.white(relativeFilePath)}`); const issueCount = suspiciousFilesResult.messages.length; const issueText = issueCount === 1 ? 'security issue' : 'security issues'; logger.log(pc.dim(` - ${issueCount} ${issueText} detected`)); }); logger.log(pc.yellow('\nThese files have been excluded from the output for security reasons.')); logger.log(pc.yellow('Please review these files for potential sensitive information.')); } // Print results for git diffs if (suspiciousGitDiffResults.length > 0) { logger.log(''); logger.log(pc.yellow(`${suspiciousGitDiffResults.length} security issue(s) found in Git diffs:`)); suspiciousGitDiffResults.forEach((suspiciousResult, index) => { logger.log(`${pc.white(`${index + 1}.`)} ${pc.white(suspiciousResult.filePath)}`); const issueCount = suspiciousResult.messages.length; const issueText = issueCount === 1 ? 'security issue' : 'security issues'; logger.log(pc.dim(` - ${issueCount} ${issueText} detected`)); }); logger.log(pc.yellow('\nNote: Git diffs with security issues are still included in the output.')); logger.log(pc.yellow('Please review the diffs before sharing the output.')); } }; export const printTopFiles = (fileCharCounts, fileTokenCounts, topFilesLength, totalTokens) => { const topFilesLengthStrLen = topFilesLength.toString().length; logger.log(pc.white(`๐Ÿ“ˆ Top ${topFilesLength} Files by Token Count:`)); logger.log(pc.dim(`โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${'โ”€'.repeat(topFilesLengthStrLen)}`)); // Filter files that have token counts (top candidates by char count) const filesWithTokenCounts = Object.entries(fileTokenCounts) .filter(([, tokenCount]) => tokenCount > 0) .sort((a, b) => b[1] - a[1]) .slice(0, topFilesLength); // Use the actual total tokens from the entire output filesWithTokenCounts.forEach(([filePath, tokenCount], index) => { const charCount = fileCharCounts[filePath]; const percentageOfTotal = totalTokens > 0 ? Number(((tokenCount / totalTokens) * 100).toFixed(1)) : 0; const indexString = `${index + 1}.`.padEnd(3, ' '); logger.log(`${pc.white(`${indexString}`)} ${pc.white(filePath)} ${pc.dim(`(${tokenCount.toLocaleString()} tokens, ${charCount.toLocaleString()} chars, ${percentageOfTotal}%)`)}`); }); }; export const printCompletion = () => { logger.log(pc.green('๐ŸŽ‰ ๅ…จ้ƒจๅฎŒๆˆ๏ผ')); logger.log(pc.white('ๆ‚จ็š„ไป“ๅบ“ๅทฒๆˆๅŠŸๆ‰“ๅŒ…ใ€‚')); }; //# sourceMappingURL=cliPrint.js.map