aico-pack
Version:
A tool to pack repository contents to single file for AI consumption
93 lines โข 5.37 kB
JavaScript
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